never
,是为啥呢?// 示例1
type DataTypeNever = {
d: true;
e: number;
} & {
d: false;
e: number;
}
let data: DataTypeNever = (() => {
throw new Error
})()
{ 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
})()
}
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。
我在https://stackoverflow.com/questions/71183840/why-type-intersections-results-in-never-type/71194657#71194657里也提了相同的问题,根据有个朋友的回答找到了对应的Typescript的https://github.com/microsoft/TypeScript/pull/36696 ,大家可以参考下
用百度翻译大概翻译了PR的描述部分,以下是翻译的部分:
长期以来,我们一直推测,如果对象类型中存在无法判定可以交叉的类型属性的交叉结果应该为never类型,因为这种类型的对象不可能构造。该PR最终实现了该功能。
除了在#31838中实现的交叉类型外,交叉类型T1 & T2 & ... & Tn
在满足下述条件时相当于never类型
Tx
类型具有相同名称的属性literal type
)类型,并且该属性不具有never
类型never
类型例子:
type A = { kind: 'a', foo: string };
type B = { kind: 'b', foo: string };
type C = { kind: number, foo: string };
type D = { kind: never, foo: string };
type E = { kind: 'a', foo: number };
type AB = A & B; // never
type BC = B & C; // never
type AD = A & D; // { kind: never, foo: string }
type AE = A & E; // { kind: never, foo: never }