2
下面的類型定義是不可實現的,但編譯器在定義它時不會給出警告。爲什麼我可以在Typescript中創建不可能的交集類型?
// No type error
type impossible = 0 & string[] & 'anything'
值不能是數字和字符串[]和字符串文字。
- 爲什麼打字稿允許創建不可能的類型?
- 是否有真正的用例來定義不能實現的類型?
下面的類型定義是不可實現的,但編譯器在定義它時不會給出警告。爲什麼我可以在Typescript中創建不可能的交集類型?
// No type error
type impossible = 0 & string[] & 'anything'
值不能是數字和字符串[]和字符串文字。
安德斯·海爾斯伯格provided以下理由:
是可能的交叉基本類型(例如
string & number
),但它是不可能的實際創建這樣的類型(比undefined
其他)的值。由於這些類型可能源自泛型類型的實例化(這是懶惰地執行的),所以不可能一致地檢測創建類型的操作併發生錯誤。
他還評論說在2015年7月3日:
的交點類型允許構成類型是類型參數。因此,你可以寫
declare function combine<T, U>(obj1: T, obj2: U): T & U;
這增加了重要的新的表現力,並且使我們能夠更好地模擬現有的JS成語。然而,由於類型參數可以用任何類型參數實例化,所以我們不能預先檢查交集類型是否爲「有效」。相反,我們必須準備好將任何類型和所有類型相交,並將「錯誤」表面化爲沒有值的類型(例如
string & number
)。你可能會爭辯說,當我們實例化這種類型時,我們應該錯誤,但是在一個多態類型系統中的類型實例化在設計上嚴重延遲(即它發生在「及時」)以避免類型爆炸,並且如果錯誤報告實際上不確定我們走那條路。