Typescript交叉类型出现never的场景?

示例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
    })()
}

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,将会以问答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 }