示例1 中交叉类型结果为never
,是为啥呢?
// 示例1
type DataTypeNever = {
d: true;
e: number;
} & {
d: false;
e: number;
}
let data: DataTypeNever = (() => {
throw new Error
})()
示例2 中交叉类型结果为{ d: false, e: never }
,为何和示例1不同呢?
// 示例2
type DataType = {
d: false;
e: number;
} & {
d: false;
e: string;
}
let data: DataType = {
d: false,
e: (() => {
throw new Error
})()
}
我在stackoverflow里也提了相同的问题,根据有个朋友的回答找到了对应的Typescript的PR ,大家可以参考下
用百度翻译大概翻译了PR的描述部分,以下是翻译的部分:
长期以来,我们一直推测,如果对象类型中存在无法判定可以交叉的类型属性的交叉结果应该为never类型,因为这种类型的对象不可能构造。该PR最终实现了该功能。
除了在#31838中实现的交叉类型外,交叉类型
T1 & T2 & ... & Tn
在满足下述条件时相当于never类型Tx
类型具有相同名称的属性literal type
)类型,并且该属性不具有never
类型never
类型例子: