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。