必須ステップの強制
必要なフィールドがすべて設定されるまで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フィードバックを取得できます。ローカル設定は不要です。