タプルの長さによるカウント
型の中で数値をタプルの長さとして表現します。
「タプルの長さによるカウント」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。
数値には表現が必要
型システムは数値リテラルを直接加算できません。一般的な回避策は、数値 N をN 個の要素を持つタプルとして表現することです。中身は重要ではなく、長さだけが重要です。
type Three = [unknown, unknown, unknown];
type N = Three["length"]; // 3長さの読み取り
すべてのタプル型には、length プロパティがあり、その型は数値リテラル型です。["length"]でインデックスアクセスすると、その値を数値として読み出して利用できます。
type A = [1, 2, 3, 4]["length"]; // 4
type B = []["length"]; // 0
type C = ["x"]["length"]; // 1unknown を使う理由
値そのものは重要ではなく、個数だけが必要なため、要素の型にはunknownを使います。どの型でも機能しますが、unknownなら「プレースホルダー」であることを明確に示せます。
type Two = [unknown, unknown];
type N = Two["length"]; // 2長さ N のタプルを構築する
逆に、再帰を使って目標の長さのタプルを構築することもできます。長さがNと一致するまで要素を追加し、一致したらタプルを返します。これが有名なBuildTupleヘルパーです。
type BuildTuple<N extends number, Acc extends unknown[] = []> =
Acc["length"] extends N ? Acc : BuildTuple<N, [...Acc, unknown]>;
type A = BuildTuple<3>; // [unknown, unknown, unknown]BuildTuple のループの仕組み
BuildTuple<3>の動きを追ってみましょう。
- 累積値の長さは0で、3ではないため、1つ追加します
- 累積値の長さは1で、3ではないため、1つ追加します
- 累積値の長さは2で、3ではないため、1つ追加します
- 累積値の長さは3で、3と等しいため、返します
累積値の長さがループカウンターになります。
type A = BuildTuple<2>; // [unknown, unknown]長さが橋渡しになる
数値とタプルの間を移動するには、2つの操作を使います。
- 数値からタプルへ:
BuildTuple<N> - タプルから数値へ:
T["length"]
型レベルの算術はすべて、この橋を渡ることを基礎にしています。
type FromN = BuildTuple<4>; // tuple of length 4
type BackToN = FromN["length"]; // 4長さで比較する
タプルの長さはリテラル型なので、個数が等しいかどうかを確認できます。タプルを構築し、代入可能性によって長さを比較します。
type SameLength<A extends unknown[], B extends unknown[]> =
A["length"] extends B["length"] ? true : false;
type X = SameLength<[1, 2], ["a", "b"]>; // true
type Y = SameLength<[1], ["a", "b"]>; // falseジェネリックな長さカウンター
仕組みを理解するために、再帰を使ってlengthを再実装できます。ただし、["length"]を読み取る方が高速です。これは、カウントがタプルをたどるだけの処理であることを示しています。
type Len<T extends unknown[], Acc extends unknown[] = []> =
T extends [unknown, ...infer R]
? Len<R, [...Acc, unknown]>
: Acc["length"];
type A = Len<["a", "b", "c"]>; // 3カウンターとしてのタプル
タプルを数取りとして考えてみましょう。各要素が1つの印になります。要素を追加すると1増え、削除すると1減ります。このメンタルモデルを使うと、算術を直感的に理解できます。
type Inc<N extends number> = [...BuildTuple<N>, unknown]["length"];
type A = Inc<3>; // 4減算の予告
減算では、まずN用のタプルを構築し、最後の要素以外をすべて推論して、より短い長さを読み取ります。次のレッスンで、この処理を正式に実装します。
type Dec<N extends number> =
BuildTuple<N> extends [unknown, ...infer R] ? R["length"] : 0;
type A = Dec<3>; // 2
type B = Dec<0>; // 0覚えておくべき制限
この手法が機能するのは小さな非負整数に対してです。非常に大きなNでは再帰の制限に達し、負数や小数に対応する組み込み機能もありません。この範囲内であれば、信頼性が高く、完全に静的に処理できます。
type A = BuildTuple<5>["length"]; // 5 (fine)
// BuildTuple<10000> would error: too deep理解度チェック
タプルの長さを使ったカウントについて、理解度を確認しましょう。
まとめ
カウントは型レベルの算術の基礎です。
Nを長さNのタプルとして表します。T["length"]で数値を読み取ります。BuildTuple<N>は数値からタプルを構築します。- 小さな非負整数に対してのみ機能します。
次は、実際の加算と減算です。
よくある質問
「タプルの長さによるカウント」レッスンは無料ですか?
はい。「タプルの長さによるカウント」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。
「タプルの長さによるカウント」で何を学びますか?
型の中で数値をタプルの長さとして表現します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「タプルの長さによるカウント」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- タプルの長さによるカウント
- 型レベルの加算と減算
- 型レベルの比較
- 実践的な数値型ユーティリティ