0Pricing
TypeScript Academy · レッスン

必須ステップの強制

必要なフィールドがすべて設定されるまでbuild()を実行できないようにします。

「必須ステップの強制」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。

早すぎるbuild()を防ぐ

ここでは、蓄積された状態を使って、必須フィールドが設定されるまでbuild()の呼び出しを禁止します。不完全なビルドをブロックするのは、実行時のチェックではなく型システムです。

最終的な形状を定義

まず、完全なオブジェクトと、必須となるキーを宣言します。ビルダーは、状態にそれらすべてが含まれている場合にのみbuild()を許可します。

interface Config {
  url: string;   // required
  method: string; // required
  timeout?: number; // optional
}
type Required = { url: string; method: string };

条件付きbuildシグネチャ

蓄積された状態Sが必須キーを拡張している場合にのみ、buildを利用できるようにします。条件型によって、実際のメソッド、または利用できないメソッドを返します。

class Builder<S> {
  build(this: Builder<Required>): Config {
    return this.d as Config;
  }
  private d: Record<string, unknown> = {};
}

thisパラメーターの利用

this: Builder<Required>パラメーターによって、buildを呼び出せるビルダーインスタンスの種類を制約します。SがRequiredの条件を満たさない場合、呼び出しは型エラーになります。

// Only a Builder whose S includes url and method
// can legally invoke build().

セッターを状態に接続

各セッターはこれまでと同様にSを拡張します。両方の必須セッターが実行されると、Sは最終的にRequiredを拡張し、buildを呼び出せるようになります。

class Builder<S> {
  private d: Record<string, unknown> = {};
  url(u: string): Builder<S & { url: string }> { this.d.url = u; return this as any; }
  method(m: string): Builder<S & { method: string }> { this.d.method = m; return this as any; }
  build(this: Builder<{ url: string; method: string }>): Config { return this.d as Config; }
}

正常な経路はコンパイルできる

両方の必須ステップが含まれていれば、チェーンの型チェックが通り、実行できます。コンパイラーは、Sにすべての必須キーが含まれていることを確認できます。

const cfg = new Builder<{}>().url("/x").method("GET").build();
console.log(cfg.url, cfg.method);

失敗する経路

必須ステップを1つ省略すると、ビルダーのSがRequiredを拡張しないため、build()の型チェックが通らなくなります。この間違いはコンパイル時に検出されます。

// const bad = new Builder<{}>().url("/x").build();
// Error: 'build' can only be called when method is set too.

実行時ガードより優れている理由

実行時のif (!this.url) throwは、コードを実行したときに初めて失敗します。一方、thisパラメーターを使う方法は型チェック中に失敗するため、不完全なビルドがリリースされることはありません。

オプションのフィールドはそのまま任意

timeoutのようなオプションのステップはRequiredに含まれないため、build()の条件にはなりません。自由に含めたり省略したりできます。

const ok = new Builder<{}>().method("PUT").url("/y").build();
console.log("order of required steps does not matter");

多くの必須条件への対応

Requiredの形状とthisパラメーターに必須キーを追加すれば、コンパイラーがすべてを強制します。このパターンは、必須ステップがいくつあっても対応できます。

制限事項

この保証は、すべてのセッターでSを正しく引き継ぎ、thisパラメーターによる型付けを使用することを前提としています。キャストはセッター内に限定し、呼び出し側では完全な型安全性を維持する必要があります。

簡単な確認

このレッスンの簡単な確認です。

まとめ

必須ステップを強制するには、buildをthis: Builder<Required>パラメーター付きで型付けします。蓄積された状態Sにすべての必須キーが含まれると、初めてメソッドの型チェックが通ります。これにより、不完全な構築がコンパイルエラーになります。

よくある質問

「必須ステップの強制」レッスンは無料ですか?

はい。「必須ステップの強制」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。

「必須ステップの強制」で何を学びますか?

必要なフィールドがすべて設定されるまでbuild()を実行できないようにします。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「必須ステップの強制」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

  1. Builderパターンの基礎
  2. 型付きFluentインターフェース
  3. 必須ステップの強制
  4. 不変なBuilder
← TypeScript Academyに戻る