type-challenges easyを解きおえた

https://github.com/type-challenges/type-challenges

type-challenges、easy問題の全13問を解き終えたので、一旦振り返りたいと思います。

各問題の振り返り

一言書こうと思ったのですが、終盤にいくにつれて特筆事項がなくなったので、ただの羅列です😅

:::details 各問題へのリンク


https://ikuma-t.work/posts/type-challenge-pick

type MyPick<T, K extends keyof T> = { [P in K]: T[P] }

キーワード:keyofIndexed Access TypeMapped Types

初見で無事ギブアップした回。最初は全くもって意味不明な記号でしたが今は見慣れました。


https://ikuma-t.work/posts/type-challenge-readonly

type MyReadonly<T> = { readonly [P in keyof T]: T[P] }

キーワード:Mapped typesreadonly

当日も自力で解けたと言っています。今回も解けました。


https://ikuma-t.work/posts/type-challenge-tuple-to-object

type TupleToObject<T extends readonly string[]> = { [P in T[number]]: P }

キーワード:TupleIndexed Access Type、`Mapped Types

ここらへんでMapped Typesに慣れてきました。


https://ikuma-t.work/posts/type-challenge-first-of-array

type First<T extends any[]> = T extends [] ? never : T[0]
type First<T extends any[]> = T extends [infer U, ...infer Rest] ? U : never

キーワード:inferConditional Types, Indexed Access Types

inferキーワード初出。これも今はだいぶ見慣れてきました。


https://ikuma-t.work/posts/type-challenge-length-of-tuple

type Length<T extends any[]> = T["length"]

キーワード:Indexed Access Types


https://ikuma-t.work/posts/type-challenge-exclude

type Exclude<T, U> T extends U ? never : T

キーワード:Conditional TypesUnion TypesDistributive

分配法則初登場回


https://ikuma-t.work/posts/type-challenge-awaited

type MyAwaited< T extends Promise<any>> = T extend Promise<infer U> ? MyAwaited<U> : never

キーワード:infer

再起的な型推論


https://ikuma-t.work/posts/type-challenge-if

type If<C extends boolean, T, F> = C extends true ? T : F

キーワード: Conditional Types


https://ikuma-t.work/posts/type-challenge-concat

type Concat<T extends any[], U extends any[]> = [...T, ...U]

キーワード: Variadic Tuple Types


https://ikuma-t.work/posts/type-challenge-includes

// この回はわからなかったのでコピペしました。
type Includes<T extends readonly unknown[], U> =
  T extends [infer First, ...infer Rest]
    ? Equal<First, U> extends true ? true : Includes<Rest, U>
    : false;

キーワード: Conditional TypesinferVariadic Tuple Types

めちゃくちゃ難しかった回です。厳密な等価評価の部分は今でもよくわかっていません。


https://ikuma-t.work/posts/type-challenge-push

type Push<T extends any[], U> = [...T, U]

キーワード: Variadic Tuple Types


https://ikuma-t.work/posts/type-challenge-unshift

type Unshift<T extends any[], U> = [U, ...T]

キーワード: Variadic Tuple Types


https://ikuma-t.work/posts/type-challenge-parameters

type MyParameters<T extends (...args: any[]) => any> = T extends (...args: infer U) => any ? U : never

キーワード: inferConditional Types

:::

感想

出てきたキーワードで重複しているものはConditional TypesinferVariadic Tuple TypesMapped TypesIndexed Access Typeskeyofって感じですかね。

自分はプリミティブ型とそこそこの用語だけオライリーの本で覚えて、あとはエイやでTypeScriptの世界にきてしまったので、いわゆる「高度な型」を実際に学ぶことができているのはとても良いなあと思います。

もともとTypeScriptを勉強しようとしたきっかけは、自作サービスを作っている時に、各ライブラリのドキュメントとかソースが軒並みTS化していて、「これTypeScriptがわからないと、単位時間あたりで取得できる情報量めちゃくちゃしょぼいんじゃね」と思ったのがきっかけでした。

自分で練習で書いているコードではeasyの問題に出てくるようなコードもまだそこまで書いていませんが、本来の目的であるライブラリのソースを理解するという点では非常に役に立っていると思います。

というわけで明日からはmedium編に突入です。これまでの延長で解けるのか、はたまた撃沈するかわかりませんが、毎日1問解いていきます!


Buy Me A Coffeeikuma-tにお恵みを!