mosya<TC> - 関数の引数を追加する型を作ろうの解説
この記事はmosya<TC>の問題の一つであるAppendArgument型の解説になります。
問題
与えられた関数型 Fn と任意の型 A に対して、第一引数に Fn を取り、第二引数に A を取り、Fn の引数に A を追加した関数型 G を生成します。
例えば、
type Fn = (
a: number,
b: string
) => number;
type Result = AppendArgument<
Fn,
boolean
>;
// expected be (a: number, b: string, x: boolean) => number
解答例
type AppendArgument<Fn, A> =
Fn extends (
...args: infer R
) => infer P
? (...args: [...R, A]) => P
: never;
Fnが関数型であることを条件として、Fn extends (...args: infer R) => infer Pという条件を指定します。...args: infer Rを指定し、...argsという関数の可変長引数をRという型に推論して代入します- 帰り値を
infer Pで、Pという型に推論して代入します Fnがこの条件を満たす場合は、(...args: [...R, A]) => Pという型を返します...args: [...R, A]は、先ほど可変長引数を配列としてRという型に推論したので、その配列にAを追加した型になります。Pは、Fnの帰り値の型なので、そのまま返します。
Authored by

Godai@steelydylan
Webサービスを作るのが好きなWebエンジニア。子供が産まれたことをきっかけに独立し法人化。サービス開発が大好き。
好きな言語はTypeScript。
Related









