関数 宣言付きポリモーフィズムを使って、可変長引数をモデル化する、型、ジェネリック
プログラミングTypeScript ―スケールするJavaScriptアプリケーション開発(Boris Cherny(著)、今村 謙士(監修)、原 隆文(翻訳)、オライリー・ジャパン)の4章(関数)、4.5(練習問題)4の解答を求めてみる。
コード
function call<T extends [unknown, string, ...unknown[]], R>(
f: (...args: T) => R,
...args: T
): R {
return f(...args)
}
function fillStr(length: number, value: string): string[] {
return Array.from({ length }, () => value)
}
function fillNum(length: number, value: number): number[] {
return Array.from({ length }, () => value)
}
console.log(call(fillStr, 10, 'a'))
// 以下はエラー
// console.log(call(fillNum, 10, 1))
// fillXXXXX関数をジェネリックで
function fill<T>(length: number, value: T): T[] {
return Array.from({ length }, () => value)
}
console.log(call(fill, 10, 'b'))
// 以下はfの二番目の引数が文字列ではないからエラー
// console.log(call(fill, 10, 2))
入出力結果(Terminal, Zsh)
% ts-node sample4.ts
[
'a', 'a', 'a', 'a',
'a', 'a', 'a', 'a',
'a', 'a'
]
[
'b', 'b', 'b', 'b',
'b', 'b', 'b', 'b',
'b', 'b'
]
%