文字列だって、型で自在に操っちゃおう!TypeScriptのTemplate Literal Typesがすごい!
やっほー!フロントエンドの世界へようこそ!😊
今日はね、TypeScriptのちょっとクールな機能、「Template Literal Types」についてお話しするよ。
「え?文字列を型で操作するって、どういうこと?」って思った?
大丈夫、大丈夫!難しい話じゃないんだ。むしろ、これを知ると、コードを書くのがもっと楽しくなるし、ミスも減るんだから!
そもそも「型」って何だっけ? 🤔
まず、TypeScriptの「型」について、ちょっとだけおさらい。
型っていうのは、変数とか、関数の引数とか、返り値とかが「どんな種類のデータなのか」を教えてくれる、いわば「データのプロフィール帳」みたいなもの。
例えば、
- `string`:これは「文字列」だよ、って教えてくれる。
- `number`:これは「数字」だよ、って教えてくれる。
- `boolean`:これは「真偽値」(trueかfalse)だよ、って教えてくれる。
これらのおかげで、TypeScriptは「あれ?この変数、文字列が入るはずなのに、数字入れちゃってるよ!」って、コードを書いている途中で教えてくれるんだ。これが、TypeScriptの超便利なところだよね!
今日のお目当て!Template Literal Typesって何? ✨
さて、今日の本題「Template Literal Types」!
これは、JavaScriptでおなじみの「テンプレートリテラル」っていう、バックク(\` \`)で囲んで、中に `${変数}` って書くヤツ、あれを「型」の世界で使えるようにしたものなんだ。
「型でテンプレートリテラル? まだピンとこないな…」って?
大丈夫!例え話で考えてみようか。
例え話:お買い物リストを作ってみよう! 🛍️
例えば、お買い物に行くとする。
「牛乳」と「パン」と「卵」を買いたいなーって思ったとするよね。
これを、普通の文字列で書くと、こうなる。
const shoppingList = “牛乳, パン, 卵”;
でも、もし「牛乳」と「パン」と「卵」が、それぞれ別の「商品名」っていう型だったらどうなる?
そして、それを「, 」でつなげて、一つの「お買い物リスト」っていう型を作れたら、もっと便利じゃない?
Template Literal Typesは、まさにそんなことができるんだ!
文字列を「型」として扱うって、どういうこと? 🤯
Template Literal Typesを使うと、文字列の「形」を型として定義できるんだ。
例えば、こんな風に。
type Greeting = `Hello, ${string}!`;
これ、どういう意味かわかる?
「`Hello, `」っていう文字列の後に、どんな文字列でもいいから、何か一つ文字列がくっついたものが「Greeting」っていう型だよ!って言ってるんだ。
つまり、
- `”Hello, World!”` は「Greeting」型 OK! 👍
- `”Hello, TypeScript!”` も「Greeting」型 OK! 👍
- `”Good morning, everyone!”` は「Greeting」型 NG! ❌ (だって “Hello, ” で始まってないからね)
こんな風に、文字列の「パターン」を型として指定できるんだ。
具体的に何ができるの? 🛠️
Template Literal Typesを使うと、色々な文字列操作が「型レベル」でできるようになるんだ。
「型レベル」っていうのは、コードを実行する前(コンパイル時)に、TypeScriptがチェックしてくれるってこと。実行時には影響しない、まさに「設計図」を作るようなイメージだよ。
1. 文字列の結合(くっつける!)🔗
さっきの例え話にも少し出てきたけど、複数の文字列型を組み合わせて、新しい文字列型を作ることができる。
例えば、名前と苗字を組み合わせて、フルネームの型を作ってみよう。
type FirstName = “Alice”;
type LastName = “Smith”;
// 苗字と名前をスペースで区切って結合する型
type FullName = `${LastName}, ${FirstName}`; // “Smith, Alice” という型になる
// 実際に使ってみよう
const personName: FullName = “Smith, Alice”; // OK!
// const invalidName: FullName = “Alice Smith”; // Error! 型が違うよと怒られる
どう?「`Smith, `」っていう文字列と、「`Alice`」っていう文字列が、型の上でくっついて、「`Smith, Alice`」っていう新しい型ができたのがわかるかな?
これなら、うっかり「Alice Smith」みたいに順番を間違えたり、スペースを入れ忘れたりするミスを防げるんだ。
2. 文字列の分割(バラバラにする!)✂️
結合の逆で、特定のパターンにマッチする文字列を、型レベルで分割することもできるんだ。
例えば、日付の文字列 “YYYY-MM-DD” を、年、月、日に分割する型を作ってみよう。
type DateString = “2023-10-27”;
// “YYYY-MM-DD” のパターンにマッチさせて、年、月、日を抽出する型
type Year
type Month
type Day
// 実際に使ってみよう
type ExtractedYear = Year
type ExtractedMonth = Month
type ExtractedDay = Day
// 型の確認 (実際にはコード上で確認できます)
const year: ExtractedYear = “2023”; // OK
const month: ExtractedMonth = “10”; // OK
const day: ExtractedDay = “27”; // OK
この `infer` っていうのがちょっと魔法みたいなんだけど、これは「この部分にマッチする文字列を、一時的に `Y` とか `M` とかっていう型変数に名前をつけて、後で使えるようにするよ!」っていう意味なんだ。
まるで、定規で測って「この部分は何センチかな?」って調べるみたいだよね。
3. 大文字・小文字変換(気分転換!)🔄
文字列の大文字・小文字を変換する機能も、最近のTypeScriptでは追加されているんだ。
これは、特定のフォーマットに合わせたい時なんかにすごく便利。
例えば、APIから受け取ったスネークケース(`user_id` みたいにアンダースコアで区切る)の文字列を、キャメルケース(`userId` みたいに最初の単語を小文字、二つ目以降を大文字で始める)に変換する型を作ってみよう。
// まずは、スネークケースからキャメルケースに変換する型ヘルパー
type SnakeToCamelCase =
S extends `${infer First}_${infer Rest}`
? `${First}${Capitalize
: S;
// 例: “user_id” をキャメルケースに変換する
type UserIdCamel = SnakeToCamelCase<"user_id">; // “userId” という型になる
// 例: “order_item_count” をキャメルケースに変換する
type OrderItemCountCamel = SnakeToCamelCase<"order_item_count">; // “orderItemCount” という型になる
// Capitalize は、文字列の最初の文字を大文字にする組み込み型
// 小文字にする Lowercase や、全て大文字にする Uppercase もあるよ!
type ExampleCapitalize = Capitalize<"hello">; // “Hello”
type ExampleLowercase = Lowercase<"WORLD">; // “world”
type ExampleUppercase = Uppercase<"typescript">; // “TYPESCRIPT”
この `Capitalize` とか `Lowercase`、`Uppercase` は、TypeScriptが標準で用意してくれている便利な型なんだ。
まるで、文字に「明るくして!」とか「元気なくして!」とか「叫んで!」って指示してるみたいで面白いよね。
なんでこんなことをするの? 🤔
「ここまでして、一体何が嬉しいの?」って思うかもしれない。
でもね、これにはちゃんとした理由があるんだ。
- コードの安全性が格段にアップ!
文字列のフォーマットが崩れることによるバグ(例えば、APIのURLを間違えたり、ファイルパスを間違えたり)を、コードを書いている最中に防げるようになる。
- コードの可読性が向上!
「この文字列はこういうパターンであるべきだ」っていう意図が、型定義を見るだけで明確になる。
- コードの再利用性が高まる!
一度作った型ヘルパー(例えば、日付を分割する型とか)は、色々な場所で使い回せる。
まるで、料理のレシピを正確に書くようなもの。
「塩少々」じゃなくて「塩小さじ1/2」って正確に書くことで、誰が作っても同じ美味しい料理ができるように、型をしっかり定義することで、コードも安全で、意図した通りに動くようになるんだ。
まとめ:TypeScriptの文字列操作、マスターしよう! 💪
今日は、TypeScriptの「Template Literal Types」について、文字列の結合、分割、大文字小文字変換を中心に見てきたよ。
最初は「何これ?」って思ったかもしれないけど、身近な例え話でイメージできたかな?
- Template Literal Types は、文字列のパターンを型として扱える強力な機能。
- 文字列を結合したり、分割したり、大文字小文字を変換したりできる。
- これらはすべて型レベルで行われるので、コードの実行前にエラーを見つけやすい。
- APIとの連携、設定ファイルの管理、UIのコンポーネント名など、様々な場面で活躍する。
最初はちょっと戸惑うかもしれないけど、実際にコードを書いて動かしてみると、「なるほど!」って膝を打つ瞬間がきっと来るはず。
ぜひ、今日の話を参考に、色々な文字列操作を試してみてね!
TypeScriptの世界は、まだまだ奥が深くて面白いことがたくさんあるよ!
また次の記事で、一緒に学んでいこうね! 👋

コメント