TypeScriptで公称型っぽく書くときは推論の結果がneverにならないように注意したい、という話。
enum FooBrand { }
type FooId = string & FooBrand;
type BarId = string & { _barBrand: never };
type BuzId = string & { _buzIdBrand: never };
type BarBuzId = BarId & BuzId;
function foo() {//: never
return "" as FooId;
}
function bar1() {//: BarId
return "" as BarId;
}
function bar2() {//: string & { _barBrand: never }
return "" as string & { _barBrand: never };
}
function barbuz1() {//: string & {_barBrand: never;} & {_buzIdBrand: never;}
return "" as BarId & BuzId;
}
function barbuz2() {//: BarBuzId
return "" as BarBuzId;
}
- enumを使うとneverとして推論される
- 使用箇所で直接&を使っていると中身が展開される
Brand自体を組み合わせなければそこまで厳しくわないが、
組み合わせて使いだすと結果が長いので一旦定義し直すほうがスッキリして見える。