計算機科学のブログ

関数 型安全、JavaScriptのargumentsオブジェクトの代替、可変長引数関数、レストパラメーター

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

argumentsオブジェクトは型安全ではない。

JavaScriptの以下のコードをTypeScriptで型安全であるよに書き換えてみる。

function product() {
    return Array.from(arguments)
        .reduce(
            (prev, cur) => prev * cur,
            1
        )
}

console.log(product(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
console.log(product(1, 'a'));

入出力結果(Terminal, Zsh)

% node sample2.js 
3628800
NaN
%
function product(...numbers: number[]): number {
    return numbers.reduce(
        (prev, cur) => prev * cur,
        1
    )
}

console.log(product(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))

// Argument of type 'string' is not assignable to parameter of type 'number'.ts(2345)
// console.log(product(1, 'a'))

入出力結果(Terminal, Zsh)

% ts-node sample2.ts
3628800
%```