型レベルの加算と減算
タプル操作から算術演算を構築します。
「型レベルの加算と減算」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。
長さによる算術
タプルの長さによる表現を使うと、加算は連結になり、減算は先頭部分の削除になります。タプル上で計算し、その結果の長さを読み取ります。
type BuildTuple<N extends number, Acc extends unknown[] = []> =
Acc["length"] extends N ? Acc : BuildTuple<N, [...Acc, unknown]>;加算
A + Bを計算するには、長さAのタプルと長さBのタプルを構築し、両方を新しいタプルにスプレッドして、その長さを読み取ります。
type Add<A extends number, B extends number> =
[...BuildTuple<A>, ...BuildTuple<B>]["length"];
type S = Add<3, 4>; // 7連結で加算になる理由
長さ3のタプルの後ろに長さ4のタプルを続けると、長さ7のタプルになります。2つの数取りの印をつなげると1つの合計になります。そのため、長さも加算されます。
type A = Add<2, 2>; // 4
type B = Add<0, 5>; // 5
type C = Add<1, 6>; // 7プレフィックスによる減算
A - Bを計算するには、まず長さAのタプルを構築し、それを長さBのプレフィックスと残りの部分に分けて推論します。restの長さがA - Bになります。
type Sub<A extends number, B extends number> =
BuildTuple<A> extends [...BuildTuple<B>, ...infer Rest]
? Rest["length"]
: never;
type D = Sub<7, 4>; // 3減算をたどる
Sub<7, 4>の場合は、長さ7のタプルを構築し、長さ4のプレフィックスに一致させ、Rest(長さ3)を取り出して、その長さを読み取ります。削除したプレフィックスは、まさにB個の印です。
type A = Sub<5, 2>; // 3
type B = Sub<4, 4>; // 0アンダーフローでは never を返す
ここで扱う型レベルの数値は非負です。B > Aの場合、有効なプレフィックスが存在しないためパターンは失敗し、結果はneverになります。必要であれば、デフォルト値を0にできます。
type A = Sub<2, 5>; // never
type SubSafe<A extends number, B extends number> =
[Sub<A, B>] extends [never] ? 0 : Sub<A, B>;
type B = SubSafe<2, 5>; // 0インクリメントとデクリメント
1を加算または減算する処理はよく使うため、特別なケースとして名前を付けることが一般的です。Incは要素を1つ追加し、Decは1つ削除します。
type Inc<N extends number> = [...BuildTuple<N>, unknown]["length"];
type Dec<N extends number> =
BuildTuple<N> extends [unknown, ...infer R] ? R["length"] : 0;
type A = Inc<4>; // 5
type B = Dec<4>; // 3繰り返しによる乗算
乗算は加算の繰り返しです。Decでカウントダウンしながら、Addを使って累積値にBをA回加算します。
type Mul<A extends number, B extends number, Acc extends number = 0> =
A extends 0 ? Acc : Mul<Dec<A>, B, Add<Acc, B>>;
type A = Mul<3, 4>; // 12BuildTuple ヘルパー
ここで扱うすべての操作はBuildTupleに依存しています。これは再利用できる単一の基本部品です。数値を渡すと、その長さのタプルが返ります。これを1か所にまとめ、その上に残りの処理を構築しましょう。
type Five = BuildTuple<5>; // [unknown, unknown, unknown, unknown, unknown]
type N = Five["length"]; // 5操作を組み合わせる
各操作は数値を受け取り、数値を返すため、自由に組み合わせられます。Add<Mul<2, 3>, 4>のような式を記述すれば、コンパイラーが評価します。
type Result = Add<Mul<2, 3>, 4>; // 10実用上の注意
これらのテクニックは、配列のインデックスや固定サイズ、範囲の決まった値など、小さな個数に適しています。大きな数値や一般的な数学では、再帰の制限や負数を扱えないことから実用的ではありません。値が小さく静的に決まる場合に使いましょう。
type A = Add<8, 7>; // 15 (fine)
// Add<5000, 5000> would exceed recursion limits理解度チェック
型レベルの算術について、理解度を確認しましょう。
まとめ
型システムで算術を実装しました。
- Add:タプルを連結し、長さを読み取ります。
- Sub:プレフィックスを推論し、残りの長さを読み取ります。
Inc/Decは1ステップ分の処理です。BuildTupleは共有する基本部品です。
次は、型レベルで数値を比較します。
よくある質問
「型レベルの加算と減算」レッスンは無料ですか?
はい。「型レベルの加算と減算」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。
「型レベルの加算と減算」で何を学びますか?
タプル操作から算術演算を構築します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「型レベルの加算と減算」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- タプルの長さによるカウント
- 型レベルの加算と減算
- 型レベルの比較
- 実践的な数値型ユーティリティ