typescript は型を名前ではなく構造で判断しますが、名前で判断した方が都合がいい場合もあり、そういう場合の型を名前で判断させる為の方法です。
名前的型
以下のコードを実行した場合、エラーを期待する場所でもエラーにはなりません。
type Id1 = string
type Id2 = string
function sam(id: Id2) {
}
let id: Id1 = 'abcdef'
sam(id) // OK ※エラーにはならない
引数の型は Id2 で、渡された値の型は Id1 なのですが、型を構造で判断しているのでエラーにはなりません。
このような場合に型を名前で判断させる「名前的型」が役に立ちます。
型のブランド化
名前的型のそれぞれに対して、合成的な「型のブランド」を作成します。
type Id1 = string & { readonly brand: unique symbol }
type Id2 = string & { readonly brand: unique symbol }
「ブランド」として unique symbol を使いその型が一意である事を示しています。 指定した string が、指定したブランド型であることを主張できるように、そのブランドと string の交差を取りました。
コードまとめ
これで渡された値の型が Id1 の場合はエラーになります。
type Id1 = string & { readonly brand: unique symbol }
type Id2 = string & { readonly brand: unique symbol }
function Id1(id: string) {
return id as Id1
}
function Id2(id: string) {
return id as Id2
}
function sam(id: Id2) {
}
let id1 = Id1('abcdef')
let id2 = Id2('ghijkl')
sam(id2) // OK
sam(id1) //エラー