以下类型定义是不可实现的,但编译器在定义时没有给出警告。
// No type error
type impossible = 0 & string[] & 'anything'
值不能是数字和字符串[]以及字符串文字。
答案 0 :(得分:5)
Anders Hejlsberg provided以下理由:
可以交叉基元类型(例如
string & number
),但实际上不可能创建此类型的值(undefined
除外)。因为这些类型可能来自泛型类型的实例化(这是懒惰地执行),所以不可能对创建类型的操作进行一致的检测和错误。
他还在2015年7月3日的评论中说:
交集类型允许组成类型为类型参数。因此,你可以写
declare function combine<T, U>(obj1: T, obj2: U): T & U;
这增加了重要的新表现力,使我们能够更好地模拟现有的JS习语。但是,由于类型参数可以使用任何类型参数进行实例化,因此我们无法预先检查交集类型是否有效&#34;。相反,我们必须准备好与任何和所有类型相交,并且有#34;错误&#34;表面作为没有值的类型(例如
string & number
)。您可能会认为我们在实例化这样的类型时应该出错,但是多态类型系统中的类型实例化是设计严重推迟的(即它恰好发生在#34;及时#34;)以避免类型爆炸和我们的错误报告如果我们走那条路,就会变得几乎不确定。