コストの高い型操作を避ける
深く再帰する型や分配型を特定して修正します。
「コストの高い型操作を避ける」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。
型操作が高コストになる原因
深く再帰する型、大規模なユニオンの分配、複雑なinferの連鎖により、TypeScriptは多数の型のバリエーションをインスタンス化する必要があり、処理が指数関数的に遅くなることがあります。
// Expensive: distributes over every member of a large union
type FilterStrings<T> = T extends string ? T : never;
type Result = FilterStrings<string | number | boolean | null | undefined | ...>;過度に大きなユニオンを避ける
数百個のメンバーを持つユニオン(多数の文字列リテラルから生成されたものなど)は、型チェックを非常に遅くすることがあります。対象範囲を狭めるか、検証と組み合わせたstringの使用を検討してください。
// Expensive
type HugeUnion = "a" | "b" | "c" | /* 200 more ... */ "z";
// Better: string with a runtime check
function isValid(s: string): s is ValidString { return VALID_SET.has(s); }複雑な型エイリアスよりインターフェースを優先する
TypeScriptは、複雑な型エイリアスの交差型よりもインターフェースを積極的にキャッシュします。何度も参照するオブジェクトの形状にはinterfaceを優先してください。
// Slow: recomputed union intersection each time
type BigObject = TypeA & TypeB & TypeC & TypeD;
// Fast: interface (cached)
interface BigObject extends TypeA, TypeB, TypeC, TypeD {}再帰の深さを制限する
再帰的な条件型は強力ですが、TypeScriptの深さ制限(通常は100レベル)に達することがあります。深さのカウンターを追加して、早い段階で処理を打ち切ってください。
type Flatten<T, Depth extends number[] = []> =
Depth["length"] extends 10 ? T
: T extends (infer U)[] ? Flatten<U, [...Depth, 0]>
: T;中間型をキャッシュする
複雑な中間型に名前を付けると、TypeScriptは参照のたびに再計算せず、その型をキャッシュして再利用できます。
// Before: recomputed at each use
type MyResult<T> = T extends SomeComplex<infer U> ? Transform<U> : never;
// After: split into named intermediates
type ExtractU<T> = T extends SomeComplex<infer U> ? U : never;
type MyResult<T> = Transform<ExtractU<T>>;大きなオブジェクトに深いマップ型を適用しない
非常に大きなオブジェクト型にDeepReadonlyを適用すると、TypeScriptはすべてのプロパティを再帰的に走査するため、処理コストが高くなります。
// Expensive on 50-property nested objects
type Safe = DeepReadonly<HugeConfig>;
// Better: annotate at creation time with const assertions遅延ジェネリック評価を使用する
高コストな型をthunk(その型を返す関数型)でラップすると、実際に必要になるまで評価を遅延できます。
// Lazy evaluation via wrapper
type Lazy<T> = () => T;
type ExpensiveLazy = Lazy<DeepReadonly<HugeConfig>>;戻り値の型を明示する
関数の戻り値の型を明示的に注釈すると、TypeScriptが呼び出し箇所ごとに繰り返し推論する必要がなくなり、型チェックが高速になります。
// Let TypeScript infer (may be slow for complex functions)
function process(data: Input) { return transform(data); }
// Faster: explicit annotation
function process(data: Input): Output { return transform(data); }並列チェックのためのisolatedDeclarations
TypeScript 5.5以降のisolatedDeclarationsでは戻り値の型を明示する必要があり、完全な推論を行わずに独立したファイルを並列で型チェックできるようになります。
// tsconfig.json
{
"compilerOptions": {
"isolatedDeclarations": true
}
}分離のためのプロジェクト参照
プロジェクト参照を使うと、変更されていないパッケージをTypeScriptが型チェックしなくなります。大規模なモノレポでは、これが最も大きな効果をもたらします。
# With project references:
# tsc --build only recompiles packages whose sources changed
# Unchanged packages: declaration files used directly振り返り:高コストな型を避ける
TypeScriptを高速に保つには、巨大なユニオンを避け、中間型をキャッシュし、複雑な型エイリアスよりインターフェースを優先し、再帰の深さを制限し、戻り値の型を明示し、プロジェクト参照でパッケージを分離してください。
確認問題
オブジェクトの形状をTypeScriptにより積極的にキャッシュさせるには、どの方法が有効ですか?
学んだこと
高コストなTypeScriptの型操作には、大規模なユニオン、深い再帰、複雑な推論の繰り返しなどがあります。中間型をキャッシュし、インターフェースを優先し、ユニオンのサイズを制限し、モノレポではプロジェクト参照を使用して最適化してください。
よくある質問
「コストの高い型操作を避ける」レッスンは無料ですか?
はい。「コストの高い型操作を避ける」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと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フィードバックを取得できます。ローカル設定は不要です。