計算機科学のブログ

関数 宣言付きポリモーフィズムを使って、可変長引数をモデル化する、型、ジェネリック

プログラミング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'
]
%