创建一个不能被基类型替换的新类型

时间:2016-06-15 19:16:30

标签: types casting typescript

在TypeScript中,我可以创建一个名为UnitCount的类型作为number的别名:

type UnitCount = number;

如果我现在定义一个带有此类型参数的函数,我可以使用UnitCountnumber调用该函数:

function test(units: UnitCount) {
    console.log('units =', units);
}

test(1 as UnitCount); // correct
test(2); // also correct

有没有办法定义UnitCount,以便在没有明确演员的情况下number无法使用UnitCount

2 个答案:

答案 0 :(得分:2)

由于TypeScript使用结构类型,您必须找到一种在结构上区分类型的方法。

一种方法是使用" brand"扩展Number并将未使用的属性添加到类型中...不幸的是,使用它需要断言any

interface UnitCount extends Number {
    _unitCountBrand: any;
}

function test(units: UnitCount) {
    console.log('units =', units);
}

test(1 as any); // ok
test(2); // error

这个断言可以被抽象成一个函数,这个更好一点:

function toUnitCount(val: number) {
    return val as any as UnitCount;
}

test(toUnitCount(1)); // ok
test(2); // error

请注意,目前有一些关于supporting nominal typesunits of measure的讨论。

答案 1 :(得分:0)

最简单的方法可能是定义一个带有数字字段的接口:

interface UnitCount {
  value: number;
}