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

And*_*i V 5 generics typescript conditional-types

我需要一个泛型类型,当(此属性的)泛型参数为 时,该泛型类型可以从指定类型中排除泛型属性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'
};
Run Code Online (Sandbox Code Playgroud)

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

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

Tit*_*mir 9

条件类型分布在裸类型参数上。这意味着条件类型将应用于联合的每个成员。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"
};

Run Code Online (Sandbox Code Playgroud)

游乐场链接