下面的类型定义是无法实现的,但是在定义它时,编译器没有警告我。
// No type error
type impossible = 0 & string[] & 'anything'
Run Code Online (Sandbox Code Playgroud)
值不能是数字,string []和字符串文字。
Anders Hejlsberg 提供了以下理由:
可以与原始类型(例如
string & number)相交,但实际上不能创建此类类型的值(除外undefined)。由于此类类型可能是由于泛型类型的实例化(延迟执行)导致的,因此无法一致地检测创建类型的操作并对其进行错误提示。
他还于2015年7月3日发表评论:
相交类型允许构成类型成为类型参数。因此,您可以编写
Run Code Online (Sandbox Code Playgroud)declare function combine<T, U>(obj1: T, obj2: U): T & U;这增加了重要的新表达能力,并使我们可以更好地对现有JS惯用语进行建模。但是,由于可以使用任何类型参数实例化类型参数,因此我们无法预先检查交集类型是否为“有效”。相反,我们必须准备好与任何和所有类型相交,并且将“错误”表面显示为没有值的类型(例如
string & number)。您可能会争辩说,我们在实例化这样的类型时应该出错,但是多态类型系统中的类型实例化在设计上被严重推迟(即,它“及时”发生),以避免类型爆炸,并且如果我们走了那条路。
| 归档时间: |
|
| 查看次数: |
220 次 |
| 最近记录: |