Open15
type-challengesをやっていく
マイルール
- 10分わからなければ答えを見る
- 気になったことがあれば脱線しまくって良い
特に言及なし
- 最初からわからん
- Kで与えられるunion型に対してMapped Typeにすれば良いことはわかったけど、Tのindexとするにはどうすればいいんだ…というところで詰まった
- なるほどkeyof...
- Tにはobjectが渡される
- Tのコピーは keyof Tで作れる
- readonlyなフィールドってどうやって作るんだっけ
- https://typescript-jp.gitbook.io/deep-dive/type-system/readonly
- キーの前か
type MyReadonly<T> = { readonly [K in keyof T]: T[K] }
- Tは何かしらの配列
- 配列をunion型にできれば良い?
- typeof T[number] じゃだめなんか?
-
'T' only refers to a type, but is being used as a value here.
これなんだっけ- あーTは型であり値ではないのか
- うーんタイムアップ
解説を読む
- https://zenn.dev/link/comments/d134e180bd721f
- なるほどー、Indexed Access Typesをちゃんと理解できてなかった感がある
- オブジェクトの場合はkeyをインデックスとして渡すが、配列の場合は
number
を渡すのか- 複数の型が含まれる配列の場合はどうなるんだ
-
type T = (string | number | boolean)[][number]
- Tは
string | number | boolean
になった、言われてみれば納得
- Tは
- 配列の最初の型を得る
-
T[0]
で大体のテストケースは通ったけど、First<[]>
でneverが来て欲しいがundefinedになってる - conditional typeか?
-
T[0] extends undefined ? never : T[0]
これだとundefined
を期待するパターンでneverになる - テストケースよく考えられてるな
-
type First<T extends any[]> = T[number] extends never ? never : T[0]
これでいけた
他の回答を読む
-
https://github.com/type-challenges/type-challenges/issues/14592
- なるほどTが空配列の場合型は
never[]
だもんな
- なるほどTが空配列の場合型は
- 要素の数を数える?型で?
- 何もわからない
解説を読む
-
type Length<T extends readonly any[]> = T["length"]
なんだこれは - T["length"] ???
- https://zenn.dev/link/comments/e7db7c9e547310
- Indexed Access Typeでオブジェクトのキーを参照できるように、オブジェクトのlengthプロパティにもアクセスできるのか、知らなかった
- arrayの他のプロパティを試してみようと思ったけど、lengthくらいしかないんだな
- TもUもunion type
- union type同士の差を得ることってできるんか?
- わからん
解説を読む
- https://zenn.dev/link/comments/5f2bf0bd79ce5f
- distributive conditional types ... ???
Conditional Types の条件部において T extends U の T が ユニオン型である場合 T に対して反復処理を行い各要素に条件を適用します。
- conditional typesを使うとなると、Tはunion typeなので、各要素を反復して処理される
-
MyExclude<'a' | 'b' | 'c', 'a'>
の場合、 ('a' | 'b' | 'c') と 'a' を比較するのではなくて、各要素が 'a' と比較されるってことか
-
- うーんこれは知識がないと解けなかったかもなあ
- 知らなかったし、今まで何やってるのかわからなかったライブラリの型とかも読めるようになりそう
- Promiseを外したい
- TがPromiseを継承してたらゴニョゴニョ
- infer案件では?
-
type MyAwaited<T> = T extends Promise<infer U> ? U : never
これで行けそうな気がしたけど、ネストされたPromiseでエラーになってる… - Promiseのネストを外したい
- Promiseのネストをするな
- わからない
回答を読む
-
https://github.com/type-challenges/type-challenges/issues/14584
- あ〜〜〜…型の定義中に同じ型を再帰的に使っていいのか
- 導入されたPR: https://github.com/microsoft/TypeScript/pull/40002
- 再帰の深さに制限があるとのこと: https://qiita.com/kgtkr/items/eff20225e4bf9b159110
- conditional typeでCがtrueだったらT, CがfalseだったらFを返せばいいんでは?
-
type If<C, T, F> = C extends true ? T : F
これでええやんと思ったけど、Cでnullが渡されるケースでエラーになってくれていないな -
type If<C extends boolean, T, F> = C extends true ? T : F
boolean指定すれば良いか
- T, U両方Arrayで、中身を手に入れる必要がある
- distribute conditional typesのやつか!?(知った単語をすぐ使う)
- わからん
回答を読む
- https://zenn.dev/link/comments/43403525ad6733
- varadic tuple type...?
- 知らなかった、スプレッド構文がTSでもできるんだ
- Excludesの逆で考えれば良いかな
- TはArrayなので、union typeに変換できればU extends Tができる?
-
type ToUnion<T extends any[]> = T[number]
でunion typeは作れる
-
-
type Includes<T extends readonly any[], U> = U extends T[number] ? true : false
これである程度のパターンは通るけど、Expect<Equal<Includes<[{}], { a: 'A' }>, false>>
とかが通ってないな- trueが返ってきてる
- グエーわからん
回答を見る
-
https://zenn.dev/link/comments/907e84d626d383
- うーん…?
-
https://zenn.dev/syun43/articles/9d8bc41ddae9be#includes
- あーなるほど…
- 以下の処理を組み合わせる
- 型の比較 ...
Equal<A, B>
でbooleanを返す - Varadic Tuple Typeで配列の中身を先頭(First)とその他(Rest)に分割する
- FirstとUを比較し、trueなら終了、falseならRestを使って再帰処理
- 型の比較 ...
- Equalは
type-challenges/utils
の型を使ってる回答が多い感じかな?- https://github.com/type-challenges/type-challenges/blob/main/utils/index.d.ts#L7-L9
-
type MyEqual<X, Y> = X extends Y ? Y extends X ? true : false : false
こんな感じでXとYが互いに代入可能なのであればEqualと見なせるんじゃ?- と思ったけど
Expect<Equal<Includes<[{ a: 'A' }], { readonly a: 'A' }>, false>>
で失敗してる -
type test = MyEqual<{ a: 'A' }, { readonly a: 'A' }>
なんでやこれでtrueが返ってくる
- と思ったけど
これ両方trueが返ってくるんだけどそういうもんなのか?
type test2 = { a: 'A' } extends { readonly a: 'A' } ? true : false
type test3 = { readonly a: 'A'} extends { a: 'A' } ? true : false