コンパイル時の入力バリデーション
実行前に不正なDSL式を拒否します。
「コンパイル時の入力バリデーション」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。
コンパイル時の入力検証
型レベル DSL は、不正な形式の式を実行前に拒否できます。テンプレートリテラル型と条件付き型を使って、文字列の構造を型レベルで検証し、無効な入力を拒否します。
例:小さなセレクター言語
"user.name" や "order.items.length" のような文字列を受け取るとします。コンパイル時に "user." や ".name" を拒否したいとします。
テンプレートリテラルで解析する
テンプレートリテラル型は infer を使って文字列を複数の部分に分割します。これはコンパイル時の解析の基礎です。実際のパターンはバッククォートで区切られます(infer を使った Head dot Tail)。ここでは、その分割マッチャーを DotSplit と表記します。
// Real TS: backtick pattern matching Head, ".", Tail.
type Split<S extends string> =
S extends DotSplit<infer Head, infer Tail>
? [Head, ...Split<Tail>]
: [S];
type P = Split<"a.b.c">; // ["a", "b", "c"]各セグメントを検証する
条件付き型で、空のセグメントがないことを確認します。空のセグメントがあると、入力は無効になります。同じ DotSplit パターン(実際のコードではバッククォートで囲んだテンプレートリテラル)が再帰処理を駆動します。
type NonEmpty<S extends string> = S extends "" ? false : true;
type Valid<S extends string> =
S extends DotSplit<infer H, infer T>
? H extends "" ? false : Valid<T>
: NonEmpty<S>;
type V1 = Valid<"a.b">; // true
type V2 = Valid<"a.">; // false有効性で API を制限する
有効性の型を使って関数パラメーターを制約します。有効な文字列はその型を維持し、無効な文字列は never に解決されるため、呼び出しはコンパイルに失敗します。
declare function path<S extends string>(
p: Valid<S> extends true ? S : never
): void;
path("user.name"); // ok
path("user."); // Error: argument is never未知のトークンを拒否する
使用できる文字も制限できます。既知のセグメントパターンだけに一致させ、それ以外はすべて拒否用の型に解決します。
type Allowed = "user" | "order" | "name" | "items";
type CheckSeg<S extends string> = S extends Allowed ? true : false;演算子を検証する
"age > 18" のような式 DSL では、テンプレートリテラルで演算子に一致させ、許可された集合に含まれていることを確認します。マッチャー(左側の空白 O 右側の空白)は実際のコードではバッククォートのテンプレートリテラルです。ここでは CondMatch と表記します。
type Op = ">" | "<" | "=" | ">=" | "<=";
// Real TS: backtick pattern -> left, " ", infer O, " ", right.
type IsCond<S extends string> =
S extends CondMatch<infer O>
? O extends Op ? true : false
: false;
type C1 = IsCond<"age > 18">; // true
type C2 = IsCond<"age ! 18">; // falseチェックを組み合わせる
実際のバリデーターでは、空でないセグメント、許可されたトークン、構造の対応など、複数の条件を組み合わせます。それぞれを条件型として定義し、論理演算のようなヘルパー型で組み合わせます。
type And<A, B> = A extends true ? (B extends true ? true : false) : false;再帰の制限
型レベルの再帰には深さの制限があります。非常に長い文字列では、コンパイラーが「type instantiation is excessively deep」というエラーを出すことがあります。解析する入力の長さを制限するか、文法を簡略化してください。
実行時の解析より優れている点
実行時パーサーでは、不正な文字列が評価された時点で初めて問題が報告されます。コンパイル時検証なら、入力した瞬間にリテラルを拒否でき、エディターから完全なフィードバックを得られるうえ、実行時のコストもかかりません。
重要な理由
多くの DSL は、パス、クエリ、フォーマットなどを文字列入力として受け取ります。型システムでその構造を検証すると、タイプミスや不正な式をプログラムの実行前に検出でき、実行時エラーの一部をコンパイルエラーに変えられます。
理解度チェック
コンパイル時の入力検証について理解できているか確認してください。
まとめ
テンプレートリテラル型と infer で文字列リテラルを解析し、条件型でセグメントと演算子をチェックすることで、実行時より前に DSL 入力を検証しました。関数パラメーターを有効性の型で制約すると、不正な式は never に解決されてコンパイルに失敗します。再帰の深さに制限がある点にも注意してください。
よくある質問
「コンパイル時の入力バリデーション」レッスンは無料ですか?
はい。「コンパイル時の入力バリデーション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。
「コンパイル時の入力バリデーション」で何を学びますか?
実行前に不正なDSL式を拒否します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「コンパイル時の入力バリデーション」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 型レベルDSLとは
- Fluent Query DSLの設計
- コンパイル時の入力バリデーション
- 型レベルDSLのエラーメッセージ