gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:50:23 25 4
gpt4 key购买 nike

我需要一个通用类型,当(此属性的)通用参数为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 时发生了什么。

最佳答案

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

关于typescript - 当通用类型设置为 never 时,通用条件类型解析为 never,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58977876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com