gpt4 book ai didi

typescript - Typescript 泛型中的 "Not in keyof"

转载 作者:行者123 更新时间:2023-12-05 03:23:16 27 4
gpt4 key购买 nike

创建一个类型,其中 Type 中的每个属性现在都是 boolean 类型:

type OptionsFlags<Type> = {
[Property in keyof Type]: boolean;
};

现在我想对此进行扩展:所有不属于 Type 的属性(如果存在)必须是string 类型。像这样:

type OptionsFlags<Type> = {
[Property in keyof Type]: boolean;
[Property not in keyof Type]?: string;
};

正确的做法是什么?

最佳答案

独立类型在这里可能行不通。您正在寻找的基本上是这样的:

type OptionsFlag<T> = {
[K in keyof T]: boolean
} & {
[K in Exclude<string, keyof T>]: string
}

但这在 TypeScript 中(还)不起作用。因为Exclude<string, keyof T>评估为 string并且将是一个索引签名。您不能使用此类型构造对象,因为每个属性的类型都必须满足两个索引签名要求 string & boolean这是不可能的。

我能想到的唯一解决方法是:

type Type = {
a: string
b: string
c: string
}

type OptionsFlag<T, S> = {
[K in keyof T]: K extends keyof S ? boolean : string
}

function f<T>(obj: OptionsFlag<T, Type>) {}

f({
a: true,
b: true,
c: "abc", // error because c is in Type and string
d: "abc",
e: "abc",
f: true // error because f is not in type and boolean
})

Playground

我们可以使用函数的通用类型来映射传递类型的每个属性 T .然后我们检查 T 的每个属性如果它属于 S并相应地调整类型。

这有一个主要缺点:S 的类型当我们声明函数时必须知道。如您所见,我输入了 TypeOptionsFlag<T, Type>在函数声明中而不是使用第二个泛型类型。 TypeScript 还不支持部分类型推断,所以我们不能让 TypeScript 推断 T并在我们调用该函数时手动指定第二个泛型类型。

关于typescript - Typescript 泛型中的 "Not in keyof",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72561941/

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