0Pricing
TypeScript Academy · レッスン

タプルの長さによるカウント

型の中で数値をタプルの長さとして表現します。

「タプルの長さによるカウント」は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"];        // 1

unknown を使う理由

値そのものは重要ではなく、個数だけが必要なため、要素の型には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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. タプルの長さによるカウント
  2. 型レベルの加算と減算
  3. 型レベルの比較
  4. 実践的な数値型ユーティリティ
← TypeScript Academyに戻る