gpt4 book ai didi

typescript - 是否可以检查对象的键是否是泛型的键?

转载 作者:行者123 更新时间:2023-12-02 18:45:19 25 4
gpt4 key购买 nike

我想创建一个函数来返回一个对象,该对象的索引是现有类型的键。

type ResponseGeneric<T> = {
[K in keyof T]?: {
otherProp: any
};
}

function validateGeneric<T>(key: keyof T, value: any): ResponseGeneric<T> {
return {
[key]: {
otherProp: value,
},
};
}

但是我在 validateGeneric 中有以下错误:

Type '{ [x: string]: { otherProp: any; }; }' is not assignable to type 'ResponseGeneric<T>'.ts(2322)

我知道我可以通过在返回时进行强制转换来解决这个问题,但我想知道是否可以使用最新的 TypeScript 版本(当前为 4.2)。

最佳答案

这仍然是 TypeScript 的错误或设计限制,根据 microsoft/TypeScript#13948 microsoft/TypeScript#21030 .如果您有一个泛型类型的计算属性名称(如 keyof T),编译器会将其扩展为 string 并使生成的对象具有 字符串 index signature .

显然,在 microsoft/TypeScript#21070 中已经完成了解决这个问题的工作。 ,但它的影响超出了团队想要接受的范围,因此从未合并。而且它看起来并没有被重新访问。

除非有任何变化,否则您将需要解决它。如您所述,最简单的方法是使用 type assertion (这是首选术语;“cast”一词有时暗示运行时行为发生变化,而 TypeScript 类型断言根本没有运行时影响):

function validateGeneric<K extends PropertyKey>(key: K, value: any) {
return {
[key]: {
otherProp: value,
},
} as { [P in K]?: { otherProp: any } };
}

请注意,我没有使用某些对象类型的类型参数 T,而是将其更改为仅使用键类型 K。您对 ResponseGeneric 的定义完全丢弃了它从 T 的属性值中获得的任何信息,只保留了键,因此我们不妨在以下情况下尝试推断对象类型没有。

const result = validateGeneric("a", 123);
/* const result: {
a?: {
otherProp: any;
} | undefined;
} */

如果您发现自己经常做这类事情,您可以将类型断言限制在单个辅助函数中,如下所示:

const kv = <K extends PropertyKey, V>(key: K, val: V) => ({
[key]: val
}) as K extends any ? { [P in K]: V } : never;

然后在您要编写计算属性的地方使用辅助函数:

function validateGeneric2<K extends PropertyKey>(key: K, value: any) {
return kv(key, { otherProp: value })
}

validateGeneric2("a", 123).a.otherProp // okay

Playground link to code

关于typescript - 是否可以检查对象的键是否是泛型的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67525400/

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