這可能是矯枉過正,但我使用類來防止意外等價,例如與實體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;' –