🤞

忙しい人のためのtype-challengesおすすめ問題

2023/06/13に公開

はじめに

type-challengesはTypeScriptの型を手を動かしながら学べる優れた問題集です。
https://github.com/type-challenges/type-challenges
初級〜最上級までレベル別に別れており、徐々にステップアップしながら学習することが可能です。
問題数も豊富で、2023年6月現在初級〜最上級で合計158問もの問題が公開されています。

問題数が豊富なのは素晴らしいことなのですが、全てを解こうとすると骨が折れます...

自分は最近まで1日1問type-challengesを解くという活動をしていて、(ほぼ)全ての問題を解き終わるのに約4ヶ月かかりました。振り返ってみると、中には類題も多く含まれていてTypeScript力を効率良く付けるのに必ずしも全ての問題を解く必要はありませんでした。

問題を一通り見た中で、特に勉強になった問題を、備忘録かつ他の人に少しでも参考になればと思いまとめます。(独断と偏見です。なるべく種類が異なる問題を選んだつもりです。)

type-challengesとは?やtype-challengesによる効果などは別の記事に書いたので気になった方は是非そちらを読んでください!(思ったより反響いただけてびっくりしました)

https://zenn.dev/yutake27/articles/9bba69e63e1399

初級編

初級編は全13問あります。(2023年6月現在)

中級編、上級編の基礎になる問題が集められています。

TypeScriptに備わっている基本のユーティリティ型を自分で実装する問題(Pick, Readonly, Exclude, Parameters)やJavaScriptのutil関数(IncludesConcatなど)を実装する問題が多いです。

基本的に文法を知っているかどうかが問われる問題なので、最初はできなくても全く心配ないです!書き方を知れれば十分です!(自分は全然できなかったです)

おすすめ問題

13問のうち、似たような種類の問題を削って10問ピックアップしました。(まとめると言っておいて全然減らせませんでした...)

つぶやきをひとこと欄に書いています。

問題 タイプ ひとこと
Pick Mapped Types
Readonly Mapped Types
Tuple To Object Mapped Types
If Conditional Types
First of Array Conditional Types
Includes Conditional Types 再帰。初級で一番難しいかも。
Parameters Conditional Types 関数のinfer。類題にReturn Typeがある。
Exclude Conditional Types Distributive Conditional Types(Union distribution)の知識が一部必要
Length of Tuple 配列
Concat 配列

中級編

中級編は問題数が非常に多く、全部で86問あります。(2023年6月現在)

おすすめしたい問題が多く選定が非常に難しかったので、おすすめ問題14問と、準おすすめ問題11問をなるべく種類が異なるように選びました。

おすすめ問題

問題 ひとこと
Omit 基本のユーティリティ
DeepReadonly 実際に使う機会ありそう
TupleToUnion 知識問題
Chainable Options 難しかった。実践的。
Promise.all 上級編でも良いくらい難しい気がする
Trim left 文字列(Template Literal Types)系
Capitalize 同じく文字列系
KebabCase SnakeCaseやCamelCaseなど他のCaseにも応用可能
IsNever 知識問題
Permutation Union distributionの理解が求められる良い問題。
IsUnion PermutationとこれができればUnion distribution理解できてそう。
AllCombinations Permutation, IsUnionの応用
ReplaceKey Mapped typeのdistribution
MinusOne 数値を計算する問題はいろいろ出てくる

準おすすめ問題

こちらは惜しくもおすすめ問題から漏れた問題たちです。おすすめ問題に類題がありますが、これらの問題を解くことでさらに理解を深められると思います。

問題 ひとこと
Append to object
Diff
Remove Index Signature 難しい。解けなくても良いかも。
Mutable これも知識系
FlattenDepth
Flip
Fibonacci Sequence 数値系
MapType
GetMiddleElement あまり見かけないタイプ。面白い。
Transpose 難しい
Combination key type Union distribution系

上級編

上級編は中級編と似たパターンの問題が多かったので、中級にはなかった種類の問題をピックアップしました。

おすすめ問題

ひとこと欄にも書いている通り、自力実装はかなり難しい問題です。
解けなくても型で表現できることを知るだけで、引き出しが増えて良いと思います。

問題 ひとこと
Simple Vue 初見では何も思いつかなかった。知っておくと良さそう
Union To Intersection 初見でできたら天才だと思う。型でこれを表現できることを知っておくくらいで良さそう
Union To Tuple これも初見殺し。同じく型で表現可能なことを知っておくくらいで良さそう。
IsAny これも知っておくくらいで良さそう
ClassPublicKeys 類似問題なかったので選出
String to Number 実装が面倒

準おすすめ問題

こちらは今まで似たタイプの問題を扱っているので解かなくても良いですが、復習と頭の体操に良いかもしれません。

問題 ひとこと
Vue Basic Props Simple Vueの類似問題
Pinia Simple Vueの類似問題
Currying 1
Tuple Filter
Object From Entries
Tree path array

最上級編

最上級編は全部で14問あり(2023年6月現在)、どれも超難しいです。

個人的にその中でも難しかった8問をピックアップしました。

このレベルの実装が必要になるケースはほとんどないと思うのでやらないでも良いと思います。(自分は一旦諦めて気が向いたときに再チャレンジすることにしました)

おすすめ問題

問題 ひとこと
slice
Integers Comparator
Currying 2 上級編のCurrying 1の応用編
Tag
Sort 型でSortをやらせるとは...
Distribute Unions
Assert Array Index
JSON Parser 型でJSON parseさせるとは...

おすすめのやり方

問題を絞ってまとめましたが、それでもまだボリュームがあるので遊び感覚でコツコツやるのがおすすめです。

以前解いた問題と似た考え方で解ける問題や、前に解いた問題の型を利用すると実装が楽になる問題があるので、解いた問題の解答や考え方はどこかにまとめておくと良いです。(自分はzennのスクラップにまとめていました)

終わりに

type-challengesの初級〜最上級まで独断と偏見でおすすめ問題をまとめました。

type-challengesやってみたかったけど問題数多すぎてチャレンジできてない...という人は是非ここにまとめた問題からチャレンジしてみてください!(それでもまだ問題数多いですが...)

ここに入れなかった問題以外にも良い問題がたくさんあるので余裕がある方は是非他の問題もやってみてください!

Discussion