計算機科学のブログ

関数 型安全なアサーション関数の実装、概略の記述、可変長引数、ジェネリック

プログラミングTypeScript ―スケールするJavaScriptアプリケーション開発(Boris Cherny(著)、今村 謙士(監修)、原 隆文(翻訳)、オライリー・ジャパン)の4章(関数)、4.5(練習問題)5の解答を求めてみる。

コード

type Is = <T>(...array: T[]) => boolean

let is: Is = <T>(...array: T[]) => {
    if (array.length == 0) {
        return true
    }
    let a = array[0]
    return array.slice(1).every(x => a === x)
}

let a = [1]
let blns = [
    is('string', 'otherstring'),
    is(true, false),
    is(42, 42),
    // エラー
    // Argument of type 'string' is not assignable to parameter of type 'number'.ts(2345)
    // is(10, 'foo'), 
    is([1], [1, 2], [1, 2, 3]),
    is(1, 1, 1, 1),
    is([1], [1], [1]),
    is(a, a, a),
]

for (const bln of blns) {
    console.log(bln)
}

入出力結果(Terminal, Zsh)

% ts-node sample5.ts
false
false
true
false
true
false
true
%