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

Jam*_*bes 5 types typescript

下面的类型定义是无法实现的,但是在定义它时,编译器没有警告我。

// No type error
type impossible = 0 & string[] & 'anything' 
Run Code Online (Sandbox Code Playgroud)

值不能是数字,string []和字符串文字。

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

Mic*_*Liu 5

Anders Hejlsberg 提供了以下理由:

可以与原始类型(例如string & number)相交,但实际上不能创建此类类型的值(除外 undefined)。由于此类类型可能是由于泛型类型的实例化(延迟执行)导致的,因此无法一致地检测创建类型的操作并对其进行错误提示。

他还于2015年7月3日发表评论:

相交类型允许构成类型成为类型参数。因此,您可以编写

declare function combine<T, U>(obj1: T, obj2: U): T & U;
Run Code Online (Sandbox Code Playgroud)

这增加了重要的新表达能力,并使我们可以更好地对现有JS惯用语进行建模。但是,由于可以使用任何类型参数实例化类型参数,因此我们无法预先检查交集类型是否为“有效”。相反,我们必须准备好与任何和所有类型相交,并且将“错误”表面显示为没有值的类型(例如string & number)。您可能会争辩说,我们在实例化这样的类型时应该出错,但是多态类型系统中的类型实例化在设计上被严重推迟(即,它“及时”发生),以避免类型爆炸,并且如果我们走了那条路。