0Pricing
TypeScript Academy · レッスン

型レベルDSLとは

型を使ってFluent APIを有効なプログラムに制約します。

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

型レベル DSL とは

型レベルのDSL(ドメイン固有言語)は、TypeScript の型を使って API を制約し、有効なプログラムだけがコンパイルできるようにします。型が文法として機能するため、無効な組み合わせはコードが実行される前に拒否されます。

組み込み DSL

組み込み DSL は、別のパーサーを用意するのではなく、ホスト言語(ここでは TypeScript)の中で動作します。通常の TS を記述しながら、型システムによって DSL のルールを適用できます。

身近な例

これまでにも型レベル DSL を使ってきました。たとえば、有効なカラム名だけを許可するクエリビルダーや、パスからパラメーターを推論するルーターなどです。型によって API が許可する内容を表現しています。

Fluent API を制約する

核心となる考え方は、各メソッドが、次に呼び出せるメソッドを制限する型を返すことです。誤った順序で呼び出すとコンパイルに失敗します。

interface Empty { from(t: string): HasFrom; }
interface HasFrom { where(c: string): HasFrom; select(): string; }

declare const q: Empty;
q.from("users").select();      // ok
q.select();                    // Error: select not on Empty

型でステートマシンを表現する

このパターンは型レベルのステートマシンです。各インターフェースが状態を、各メソッドが別の状態への遷移を表します。呼び出しを連鎖させると、コンパイラーがこのマシンに沿って処理します。

実行時チェックだけではいけない理由

実行時チェックは、ユーザーが利用している本番環境で、問題が発生した後になって初めて失敗します。型レベル DSL なら、コードを出荷する前に、エディター上で赤い波線とともに早期に失敗します。同じルールでも、フィードバックをはるかに低コストで得られます。

ファントム型パラメーター

DSL では、ファントム型パラメーターに情報を持たせることがよくあります。これはコンパイル時にだけ存在するジェネリックで、実行時のコストなしに、蓄積された状態(選択したカラムやバインドした変数など)を追跡します。

interface Query<Selected extends string> {
  select<C extends string>(c: C): Query<Selected | C>;
}

トークンとしてのリテラル型

文字列のリテラル型は DSL のトークンとして機能します。テンプレートリテラルやユニオン型と組み合わせることで、型システムが DSL のテキスト内容を解析できるようになります。

type Direction = "asc" | "desc";
declare function orderBy(col: string, dir: Direction): void;
orderBy("age", "asc");   // ok
orderBy("age", "up");    // Error: not a Direction

構成要素

型レベル DSL は、状態を表すジェネリック、分岐に使う条件付き型、文字列の解析に使うテンプレートリテラル、形状の変換に使うマップ型を組み合わせます。後のレッスンでは、これらをそれぞれ使います。

トレードオフ

型レベル DSL は強力な保証を提供しますが、使いすぎると分かりにくいエラーやコンパイル時間の増加を招くことがあります。優れた DSL は、安全性と読みやすいエラーメッセージのバランスを取ります(後のレッスンで扱います)。

これが重要な理由

ドメインのルールを型に組み込むと、コンパイラーがドメインの専門家のように働き、意味のない処理を自動的に拒否できるようになります。クエリビルダー、フォームライブラリ、エフェクトシステムがこれほど強力な保証を提供できるのは、この仕組みによるものです。

クイックチェック

型レベル DSL についての理解度を確認します。

まとめ

型レベル DSL は TypeScript の型を文法として使い、有効なプログラムだけがコンパイルできるようにします。Fluent API では、各メソッドが状態を制限する型を返すステートマシンをモデル化します。その構成要素として、ファントムジェネリック、リテラル型のトークン、条件付き型、テンプレートリテラル型、マップ型を使い、エディター上で早期にフィードバックを得られるようにします。

よくある質問

「型レベルDSLとは」レッスンは無料ですか?

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

「型レベルDSLとは」で何を学びますか?

型を使ってFluent APIを有効なプログラムに制約します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「型レベルDSLとは」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. 型レベルDSLとは
  2. Fluent Query DSLの設計
  3. コンパイル時の入力バリデーション
  4. 型レベルDSLのエラーメッセージ
← TypeScript Academyに戻る