为什么我可以在Typescript中创建不可能的交集类型?

时间:2016-09-18 03:14:43

标签: typescript types

以下类型定义是不可实现的,但编译器在定义时没有给出警告。

// No type error
type impossible = 0 & string[] & 'anything' 

值不能是数字和字符串[]以及字符串文字。

  1. 为什么打字稿允许创建不可能的类型?
  2. 是否有用于定义无法实现的类型的真实用例?

1 个答案:

答案 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;)以避免类型爆炸和我们的错误报告如果我们走那条路,就会变得几乎不确定。