Upgrade to Pro — share decks privately, control downloads, hide ads and more …

type-challenges を全問解いたのでエッセンスと推し問題を紹介してみる

type-challenges を全問解いたのでエッセンスと推し問題を紹介してみる

@kakekakemiya (株式会社ナレッジワーク フロントエンドエンジニア)

TS Kaigi Hokuriku 2025(2025/11/23)での登壇資料です
https://hokuriku.tskaigi.org/

TypeScript の型への理解・型パズル力を高めるために、type-challenges は非常に有用な教材ですが、「問題数が結構多い」「なんだか難しそう」と、食わず嫌いをされがちである印象があります。
そこで本セッションでは、type-challenges の全問題に取り組んだ自分が、解く中で学んだ型パズルのテクニックや、実務に活かせそうな部分などを「エッセンス」として紹介します。

参考記事:【TypeScript と友達に】Type Challenges を全問解いたのでエッセンスと推し問題を紹介してみる
https://zenn.dev/kakekakemiya/articles/2d7a3384a5faf0
https://zenn.dev/kakekakemiya/articles/6ea6b327aec9ea

More Decks by KNOWLEDGE WORK / 株式会社ナレッジワーク

Other Decks in Technology

Transcript

  1. © Knowledge Work Inc. ⾃⼰紹介 2 @kakekakemiya 株式会社ナレッジワーク 新卒 フロントエンドエンジニア

    フロントエンドと焼き⿃が好きです (初登壇で⼤変緊張しています...)
  2. © Knowledge Work Inc. ネストされたオブジェクトの プロパティを全部 required にしたいな... 型パズルに詳しいと何が嬉しい? 9

    アプリ内のページの情報を型レベルで 管理したいな... snake_case を camelCase に変換したいな... 関数の引数‧返り値の型を うまく取り出したいな... 2つのオブジェクト型のプロパティの差を 取得したいな ※もちろん、メンテナンス性と旨味のバランスを考える必要はあります
  3. © Knowledge Work Inc. type-challenges 15 https://github.com/type-challenges/type-challenges/blob/main/README.ja.md より type-challenges には

    たくさん良質な問題があるが... • 初学者が気軽に取り組むには 問題数が多い! • easy でも結構難しい
  4. © Knowledge Work Inc. type-challenges 16 https://github.com/type-challenges/type-challenges/blob/main/README.ja.md より type-challenges には

    たくさん良質な問題があるが... • 初学者が気軽に取り組むには 問題数が多い! • easy でも結構難しい → 全問題に取り組んで学んだ、 型パズルのエッセンスと推し問題を 紹介します!!
  5. © Knowledge Work Inc. ジェネリクスに extends をつけると型に制約を設けられる MyType<T extends [制約]>

    Object 型に対して keyof を利⽤すると property の union を取得できる エッセンス 20
  6. © Knowledge Work Inc. 初級編 24 この問題はこれで OK だが、↓のような問題だとどうなるか? •

    Second<T>: ⼆つ⽬の要素を取得する • Last<T>: 最後の要素を取得する
  7. © Knowledge Work Inc. 中級編 46 union の extends 適⽤時には分配則がはたらく

    (※分配則は算数でいうところの「a×(b + c) = a×b + a×c 」のイメージ)
  8. © Knowledge Work Inc. 中級編 49 分配される T とは別に、分配前の T

    を保存する → K は extends されないので、分配が発⽣しない!! ということで、めでたしめでたし
  9. © Knowledge Work Inc. 中級編 52 T extends … の

    T に never が渡ると、到達不能な union になり never が返る 先ほどの↓でも、再帰の最後で never を extends してしまっていた 参考:https://github.com/microsoft/TypeScript/issues/23182#issuecomment-379094672
  10. © Knowledge Work Inc. エッセンス 54 union に対して extends を利⽤すると、分配則が適⽤される

    never はジェネリクスとして extends されると、到達不能だと解釈される → 型引数の利⽤や [] での wrap など、分配をうまく制御するのが重要
  11. © Knowledge Work Inc. 上級‧最上編 70 Type instantiation is excessively

    deep and possibly infinite.(2589) というエラーが発⽣ → 再帰回数の上限に到達して、型エラーとなる
  12. © Knowledge Work Inc. 最後に 72 今⽇の発表によって • TypeScript の型がより好きになった

    • 型パズルに興味が沸いた ⽅がいらっしゃると幸いです!