📚
Type Challengesに入門する
こんにちは。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
というシグネチャを持つみたいです。
index signature
の理解も完璧じゃないなって思ったのでまたどこかのタイミングでまとめようと思います。
Discussion