TypeScriptのテンプレートリテラル型とインデックスシグネチャの便利な使い方

テンプレートリテラル型とは

TypeScriptではテンプレートリテラル型やインデックスシグネチャを使用して、文字列のパターンなどを表現できます。

テンプレートリテラル型やインデックスシグネチャを使用したコード例を以降に3つ示します。

1. 基本的なテンプレートリテラル型

`${string}@gmail.com` のようにテンプレートリテラル型を作り、型に合わない場合は警告を表示します。

TypeScript
type Gmail = `${string}@gmail.com`

const gmail: Gmail = 'example@gmail.com'
const notGmail: Gmail = 'example@mail.com'
// Type '"example@mail.com"' is not assignable to type '`${string}@gmail.com`'

2. インデックスシグネチャ

任意の文字列プロパティ(iはプロパティ名の一時的な名前)を数値として持つことができます。

TypeScript
type FruitStock = {
  apple: number
  [i: string]: number
}

const fruit: FruitStock = { apple: 1 }
fruit.banana = 3
fruit.peach = '5'
// Type 'string' is not assignable to type 'number'

3. テンプレートリテラル型とインデックスシグネチャ

テンプレートリテラル型とインデックスシグネチャを使って、イベント名とそのハンドラーを定義しています。

TypeScript
type EventName<T extends string> = `on${Capitalize<T>}Event`
type ClickEvent = EventName<'click'>
type DoubleclickEvent = EventName<'doubleclick'>
type ChangeEvent = EventName<'change'>
type Handler<T extends string> = {
  [K in EventName<T>]: () => void
}

const handlers: Handler<'click' | 'doubleclick' | 'change'> = {
  onClickEvent: () => {
    console.log('Click event handler')
  },
  onDoubleclickEvent: () => {
    console.log('Double click event handler')
  },
  onChangeEvent: () => {
    console.log('Change event handler')
  },
}

function triggerEvent(event: ClickEvent | DoubleclickEvent | ChangeEvent) {
  handlers[event]()
}

triggerEvent('onClickEvent')
triggerEvent('onDoubleclickEvent')
triggerEvent('onChangeEvent')