課題

組み込みの Parameters<T> を、Parameters<T> 自体を使わずに実装してください。

解答

この課題では、関数についての情報、より正確には関数のパラメータを取得する必要があ ります。まず、パラメータを取得するために使用するジェネリック型 T を受け取る型 を宣言してみましょう:

type MyParameters<T> = any;

さて、「未知の型を取得する」ための適切な方法は何でしょうか? そう、infer を使え ばいいのです! しかしその前に、関数をマッチさせるシンプルな Conditional 型を作成 しておきましょう:

type MyParameters<T> = T extends (...args: any[]) => any ? never : never;

ここでは型 T が、任意の型の引数と戻り値をもつ関数とマッチするかどうかをチェッ クしています。これにより、パラメータリストの any[]infer により置き換える ことができます:

type MyParameters<T> = T extends (...args: infer P) => any ? never : never;

こうすることで、TypeScript コンパイラは関数のパラメータリストを推論し、それを型 P に割り当てます。あとは true ブランチから型を返せば完了です:

type MyParameters<T> = T extends (...args: infer P) => any ? P : never;

参考