当泛型类型设置为从不时,泛型条件类型解析为从不

当(该属性的)通用参数为never时,我需要一个通用类型将一个通用属性从指定类型中排除。为此,我使用了Omit和条件类型。例如,当将通用参数设置为number时,它的行为与预期的相同,但是当通用类型设置为never时,该类型解析为never而不是排除指定的属性( Playground):

type BaseType<T> = {
  prop1: string;
  genProp1: T;
};

type Excluded<T> = T extends never ? Omit<BaseType<T>,"genProp1"> : BaseType<T>;

const obj1: Excluded<number> = {
  genProp1: 5,prop1: "something,something"
};

//obj2 is never
const obj2: Excluded<never> = {
  prop1: "dark side" //error: Type 'string' is not assignable to type 'never'
};

为什么要这样做,如何使它返回正确的类型({ prop1: string })?

编辑:与null而不是never相比,可以解决此问题。我仍然想知道使用never时发生了什么。

xuan2901 回答:当泛型类型设置为从不时,泛型条件类型解析为从不

Conditional types distribute over naked type parameters。这意味着条件类型将应用于联合的每个成员。 never被视为空联合。因此,条件类型永远不会得到应用(因为在联合中没有成员可以应用它)导致产生never类型。

简单的解决方案是使用元组禁用条件类型的分布行为:

type BaseType<T> = {
    prop1: string;
    genProp1: T;
};

type Excluded<T> =
    [T] extends [never] ? Omit<BaseType<T>,"genProp1"> : BaseType<T>;

const obj1: Excluded<number> = {
    genProp1: 5,prop1: "bla"
};

const obj2: Excluded<never> = {
    prop1: "dwdadw"
};

Playground Link

本文链接:https://www.f2er.com/3057059.html

大家都在问