fukke.cafe

TypeScript Challenges

TypeScript Challengesとは

TypeScriptを使ってさまざまな型を作る競技です。
https://github.com/type-challenges/type-challenges/blob/main/README.ja.md
このブログではTypeScript Challengesを日々精進していきます。

Pick

Pickの実装です。K extends keyof TでKをTのプロパティにしています。 例えばTが{a: string; b: string}のときKはa | bになります。 [P in K]でKのUnionの数だけfor文みたいになります。T[P]で実際にアクセスしています。
type MyPick<T, K extends keyof T> = {
  [P in K]: T[P]
}

Push

Array.pushをジェネリクスでする実装です。 スプレッド構文をつかって配列を合体させます。
type Push<T extends any[], U> = [...T, U]

Awaited

Promiseな型からPromise解決後の型を取り出す。 Promise<Promise<A>>のような型に対応できるように再帰処理にしています。 また { then: (onfulfilled: (arg: number) => any) => any }のようにPromiseなオブジェクトを自作しているものでも 判断できるようにPromiseLikeという型を使っています。
三項演算子ってどこで改行すると見やすいのかな...
type MyAwaited<T extends PromiseLike<any>> =
  T extends PromiseLike<infer U> ?
    U extends PromiseLike<any> ?
      MyAwaited<U>
    : U
  : never;

Omit

Omitはオブジェクトから任意のプロパティを削除した型です。 Excludeを使ってオブジェクトのプロパティから削除します
type MyOmit<T, K extends keyof T> = {
  [P in Exclude<keyof T, K>]: T[P]
}

Parameters

関数の引数をタプル型で返す型を実装します。
const foo = (arg1: string, arg2: number): void => {}が来たときに[string, number]を返します。
T extends (...args: [...infer U]) => anyで引数のタプルを取得できます。
type MyParameters<T extends (...args: any[]) => any> = T extends (...args: [...infer U]) => any ? U : never

If

If<true, 'a', 'b'>のときaを返すような型を実装します。
type If<C extends boolean, T, F> = C extends true ? T : F

公開日 2023/01/19

目次

Thanks you for reading.