🚀

Type Challengeに入門する

2022/12/19に公開

こんばんは。Type Challgeに入門する3日目です。本日は「タプルを受け取り、その各値のkey/valueを持つオブジェクトの型に変換する型を実装」するという問題です。

typeChallenge.ts
 const tuple = [1, '2', 3, '4', tupple] as const;
 TuppleToObject<typeof tuple>
 // expected { 1: 1, '2': '2', 3: 3, '4': '4', 'tupple
 // : 'tupple' }

実装に移ります。
今回はkeyとvalueの値が等しくなるので、Mapped Typeで左右に引数型を配置します。

tuppleToObject.ts
 type TupleToObject<T extends readonly any[]> = {
  [Key in T[keyof T]]: Key
 }

問題はT[keyof T]の箇所ですが、ここがどうしてもうまくいきません。
回答を確認すると、

answer.ts
 type TupleToObject<T extends readonly (string | number)[]> = {
  [Key in T[number]]: Key
 }

Tのkeyはnumber型でなければいけなかったみたいです。配列にアクセスする際はarray[0],array[1]のようにするからですね。
Type T[string] is not assignable to type string | number | symbolというのは配列にアクセスできない!ってことだったんですね。勉強になりました。
タプル型も普段使ったことがなかったのでこれから使っていきたいと思います。

Discussion