TypeScript テンプレートリテラル型
テンプレートリテラル型は文字列リテラル型に基づいて構築され、補間によって新しい文字列型を生成できます。
これにより、TypeScript は文字列に対してより正確な型チェックを行うことができ、イベント名、パス、クラス名などのシーンに適しています。
SVG 図解:テンプレートリテラル型
なぜテンプレートリテラル型が必要なのか
開発では、イベント名(onClick)、API パス(get:/users)、CSS クラス名(btn-primary-md)など、フォーマットされた文字列を頻繁に扱う必要があります。
通常の string 型ではこれらのフォーマットを正確に記述できませんが、テンプレートリテラル型を使用すると、これらの文字列の型を正確に定義できます。
これにより、TypeScript の型安全性が大幅に向上し、実行時エラーが減少します。
概念の説明:テンプレートリテラル型はバッククォート(`` ` ``)と
${}補間構文を使用して文字列型を定義します。これは JavaScript のテンプレート文字列に似ていますが、型レベルで使用されます。
基本構文
テンプレートリテラル型は、バッククォートと補間を使用して型を定義します。
例
type World = "world";
// テンプレートリテラル型を使用
// `Hello ${World}` は "Hello world" に相当
type Greeting = `Hello ${World}`;
// 型定義に一致する文字列のみ代入可能
var greeting: Greeting = "Hello world";
console.log("挨拶: " + greeting);
実行結果:
问候: Hello world
説明:テンプレートリテラル型は、補間の位置を実際の文字列に置き換えて、新しいリテラル型を生成します。
組み込みユーティリティ型
TypeScript は、文字列の大文字小文字を処理するための4つの組み込みユーティリティ型を提供しています。
例
type UpperHello = Uppercase<"hello">; // "HELLO"
// Lowercase:文字列を小文字に変換
type LowerHELLO = Lowercase<"HELLO">; // "hello"
// Capitalize:文字列の先頭文字を大文字に変換
type CapitalizedHello = Capitalize<"hello">; // "Hello"
// Uncapitalize:文字列の先頭文字を小文字に変換
type UncapitalizedHello = Uncapitalize<"Hello">; // "hello"
console.log("Uppercase: " + UpperHello);
console.log("Lowercase: " + LowerHELLO);
console.log("Capitalize: " + CapitalizedHello);
console.log("Uncapitalize: " + UncapitalizedHello);
実行結果:
Uppercase: HELLO Lowercase: hello Capitalize: Hello Uncapitalize: hello
適用シーン:これらのユーティリティ型は、イベント名やメソッド名など、形式を統一する必要があるシーンで非常に役立ちます。
イベント型
テンプレートリテラル型を使用すると、イベント名の型を正確に定義できます。
例
// `on${Capitalize<string>}` は "on" で始まり、先頭が大文字の文字列を生成
type EventName = `on${Capitalize<string>}`;
// `handle${Capitalize<string>}` は "handle" で始まり、先頭が大文字の文字列を生成
type Handler = `handle${Capitalize<string>}`;
// 形式に一致する文字列のみ代入可能
var clickEvent: EventName = "onClick";
var focusEvent: EventName = "onFocus";
var handler: Handler = "handleSubmit";
console.log("イベント: " + clickEvent);
console.log("ハンドラー: " + handler);
実行結果:
事件: onClick 处理器: handleSubmit
利点:テンプレートリテラル型を使用すると、"onclick"(小文字)のような誤った形式は TypeScript によって拒否されます。
パス型
テンプレートリテラル型を使用すると、API パスの型を正確に定義できます。
例
type HttpMethod = "get" | "post" | "put" | "delete";
// パスの形式を定義
type ApiEndpoint = `/${string}`; // スラッシュで始まる文字列
// 組み合わせて完全な API パス型を作成
type ApiPath = `${HttpMethod}${ApiEndpoint}`;
// 形式に一致するパスのみ代入可能
var getUsers: ApiPath = "/get/users";
var createUser: ApiPath = "/post/users";
console.log("パス: " + getUsers);
console.log("パス: " + createUser);
実行結果:
路径: /get/users 路径: /post/users
型安全性:"/users"(メソッドのプレフィックスがない)のようなパスは TypeScript でエラーになります。
複雑な例
テンプレートリテラル型は複数のユニオン型を組み合わせて、可能なすべての組み合わせを生成できます。
例
// ${number} は任意の数字に一致
type Row = `row${number}`;
type Row10 = Row; // row0, row1, row2... から row9... まで
// 複数の型を組み合わせる
type Variant = "primary" | "secondary";
type Size = "sm" | "md" | "lg";
// これにより6つの組み合わせが生成されます:btn-primary-sm, btn-primary-md, btn-primary-lg...
type ClassName = `btn-${Variant}-${Size}`;
// 生成された6つの組み合わせのいずれかのみ代入可能
var className: ClassName = "btn-primary-md";
console.log("クラス名: " + className);
実行結果:
类名: btn-primary-md
組み合わせ爆発:テンプレートリテラル型はすべての組み合わせを自動的に展開します。ユニオン型に多くのオプションがある場合、生成される型は非常に大きくなる可能性があります。
カスタムユーティリティ型
独自のテンプレートリテラルユーティリティ型を作成できます。
例
// T は任意の文字列、P は追加するプレフィックス
type Prefix<T extends string, P extends string> = `${P}${Capitalize<T>}`;
// サフィックスを追加するユーティリティ型
// T は任意の文字列、S は追加するサフィックス
type Suffix<T extends string, S extends string> = `${Capitalize<T>}${S}`;
// カスタムユーティリティ型を使用
type HandlerName = Prefix<"click", "on">;
type ButtonId = Suffix<"submit", "Btn">;
var handler: HandlerName = "onClick";
var id: ButtonId = "SubmitBtn";
console.log("ハンドラー: " + handler);
console.log("ID: " + id);
実行結果:
处理器: onClick ID: SubmitBtn
ジェネリックテンプレート:テンプレートリテラル型はジェネリックと組み合わせて、再利用可能なユーティリティ型を作成できます。
注意事項
- 補間の型:テンプレート内の
${}は、具体的な文字列、ユニオン型、string、number などにすることができます - 組み合わせ数:複数のユニオン型を組み合わせると、生成される型が非常に大きくなる可能性があります
- 大文字小文字の処理:組み込みユーティリティ型を使用して文字列の大文字小文字を処理します
ベストプラクティス:イベント名、パス、クラス名など、固定フォーマットの文字列をテンプレートリテラル型で処理すると、より良い型安全性が得られます。
まとめ
テンプレートリテラル型は、TypeScript の強力な型システムの一部です。
- テンプレート構文:補間を使用して
${T}型を構築 - 組み込みユーティリティ:Uppercase、Lowercase、Capitalize、Uncapitalize
- 適用シーン:イベント名、API パス、CSS クラス名など
- カスタム:再利用可能なユーティリティ型を作成
推奨:文字列をフォーマットする必要があるシーンでは、テンプレートリテラル型を優先的に使用して、コンパイル時の型チェックを得ましょう。
その他の拡張