📚

Type Challengesに入門する

2022/12/21に公開

こんにちは。Type Challengeに入門する4日目です。早速解いていきます。

問題

タプルTを受け取り、そのタプルの長さを返す型Length<T>を実装します。

例をみていきます。

example.ts
 type tesla = ['tesla', 'model 3', 'model X', 'model Y']
 type spaceX = ['FALCON 9', 'FALCON HEAVY', 'DRAGON', 'STARSHIP', 'HUMAN' 'SPACEFLIGHT']

 type teslaLength = Length<tesla>  // expected 4
 type spaceXLength = Length<spaceX> // expected 5

実装

とりあえずタプルを受け取るので、

lengts.ts
 type Length<T extends any[]> = any

...ここまで書きましたが、ここからは本当に見当もつきませんでした。Mapped Typeにして要素の数を取ったりできるのか(?)とか考えてみましたが無理そうなので回答を確認します。

answer.ts
 type Length<T extends readonly any[]> = T['length']

...これだけでいいの? (あとreadonly忘れてた...)
そもそも配列が'length'というkeyを持つとは限らないじゃないか!と思い訳がわかりませんでした。

結論

調べたところ、タプルは以下のinterfaceと同義らしいです。

tuple.ts
 type Tuple = {
  length: 3;
  0: 'apple';
  1: 'banana';
  2: 'grape';
 };

どうやら最初からlengthというシグネチャを持つみたいです。
https://zenn.dev/luvmini511/articles/d89b3ad241e544#3.-index-signature
https://www.typescriptlang.org/docs/handbook/2/objects.html#tuple-types

index signatureの理解も完璧じゃないなって思ったのでまたどこかのタイミングでまとめようと思います。

Discussion