Псевдонимы типов, как следует из их названия, ничего не добавляют к типу, который они псевдонимы. Что касается TS, то и A
, и B
относятся к одному и тому же типу, а именно string
.
Что вы можете сделать, так это использовать фирменные типы. Это метод, при котором вы берете базовый тип (в данном случае string
) и пересекаете его с типом объекта со свойством, чтобы сделать этот тип структурно несовместимым с чем-либо еще с точки зрения компилятора. Свойство не обязательно должно существовать во время выполнения, оно просто используется как маркер для компилятора:
type A = string & { __brand: "A"};
type B = string & { __brand: "B"};
const a1: A = makeA("example of a");
const b1: B = makeB("example of b");
function makeA(s: string) {
return s as A
}
function makeB(s: string) {
return s as B
}
function withA(a: A){
console.log(a);
}
function withB(b: B){
console.log(b);
}
withA(b1); // error
withB(a1); // error
Вспомогательные функции makeA
и makeB
не являются строго обязательными, вы можете просто использовать Утверждение типа, когда вы назначаете string
, но они улучшают DX.
Примечание : есть два предложения по формализации этого метода в системе типов ( Structural tag type
бренды и номинал unique type
бренды ), но ни один из них не объединен на момент написания, возможно, в будущей версии TS мы получим один из них.