TypeScriptでNominalな型付けを実現する
TypeScript公式リポジトリのWiki内にあるFAQ「Can I make a type alias nominal?」でワークアラウンドとして紹介されているように、交差型(&
)を利用する。
たとえば次のような型を用意しておけば:
type Nominal<T extends string> = {
__nominal__: T
}
次のように型でのみ区別可能な文字列型を作ることができる:
type PlaceId = string & Nominal<"PlaceId">
type EventId = string & Nominal<"EventId">
ただし次のように型アサーションが必要となる:
const placeId = "place1" as PlaceId
const eventId = "event1" as EventId