当通用类型设置为 never 时,通用条件类型解析为 never

Generic conditional type resolves to never when the generic type is set to never

当泛型参数(此 属性 的)为 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'
};

为什么要这样做,我怎样才能使它 return 成为正确的类型 ({ prop1: string })?

编辑: 比较 null 而不是 never 解决了这个问题。我仍然想知道当我使用 never.

时发生了什么

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