这可能是矫枉过正,但我使用类来防止意外等价,例如与实体ID。我也使用类来封装单元 - 所以这既能保证类型安全,又能让您拥有单位转换的合理归宿。
class Width {
constructor(private value: number) { }
get pixels() {
return this.value;
}
}
class Height {
constructor(private value: number) { }
get pixels() {
return this.value;
}
}
这假定您使用标准单位创建尺寸。你可以添加额外的属性访问器来获取不同单位的高度(如CM,英寸等)。
和
当您使用Width
Height
它们互不兼容,所以你不能混合起来:
function getArea(width: Width, height: Height) {
return width.pixels * height.pixels;
}
// number not assignable to `Width`
getArea(3, 4);
// `Height` is not assignable to `Width`
getArea(new Height(2), new Width(4));
// `Width` is not assignable to `Height`
getArea(new Width(2), new Width(4));
// Ok
getArea(new Width(2), new Height(4));
在大多数情况下,你会使用这个最终到终端的类型安全(就好像你在飞行中创建一个new Width(5)
......谁是说5
是宽度 - 所以你试图阻止的错误仍然会在蠕变中)。所以在大多数情况下,您会从返回Width
或Height
的东西中获得值,并且会阻止传统的...... obj.Heigl
号码意外地作为高度传递。
const sizes = new SizeProvider();
// No
getArea(sizes.Height, sizes.Width);
// Ok
getArea(sizes.Width, sizes.Height);
你可以像'type Height = number&{__h:never}一样疯狂地进行破解| {__h:从不};键入Width = number&{__w:never} | {__w:从不}},但是这也会阻止'h + h;' –