mosya
mosya Business はこちら

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;
  1. Fnが関数型であることを条件として、Fn extends (...args: infer R) => infer Pという条件を指定します。
  2. ...args: infer Rを指定し、...argsという関数の可変長引数をRという型に推論して代入します
  3. 帰り値をinfer Pで、Pという型に推論して代入します
  4. Fnがこの条件を満たす場合は、(...args: [...R, A]) => Pという型を返します
  5. ...args: [...R, A]は、先ほど可変長引数を配列としてRという型に推論したので、その配列にAを追加した型になります。
  6. Pは、Fnの帰り値の型なので、そのまま返します。

Authored by

筆者の写真

Godai@steelydylan

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

ReactやTypeScriptなどの周辺技術が学べる
オンライン学習サービスを作りました!

詳しくはこちら
mosya

mosyaはオンラインでHTML,CSS,JavaScriptを基本から学習できるサービスです。現役エンジニアが作成した豊富なカリキュラムに沿って学習を進めましょう。

© 2023 - mosya. All rights reserved.