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。