0Pricing
TypeScript Academy · レッスン

型レベルの加算と減算

タプル操作から算術演算を構築します。

「型レベルの加算と減算」は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>; // 12

BuildTuple ヘルパー

ここで扱うすべての操作は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フィードバックを取得できます。ローカル設定は不要です。

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

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