gpt4 book ai didi

TypeScript:使用 keyof 索引对象类型

转载 作者:行者123 更新时间:2023-12-03 08:44:42 27 4
gpt4 key购买 nike

我有一个按键嵌套的对象,如下所示:

const OBJECTS = {
OBJECT1: {
properties: {
prop1: { value: "a" },
},
},
OBJECT2: {
properties: {
prop2: { value: "b" },
},
},
} as const;

我正在尝试创建一个通用类型,在其中提取特定对象的属性值 - 类似于:

type PropertiesForObject<OBJECT_KEY extends keyof typeof OBJECTS> = {
[PROPERTY_NAME in keyof typeof OBJECTS[OBJECT_KEY]["properties"]]: typeof OBJECTS[OBJECT_KEY]["properties"][PROPERTY_NAME]["value"];
};

但是,我收到以下错误:

Type '"value"' cannot be used to index type '{ readonly OBJECT1: { readonly properties: { readonly prop1: { readonly value: "a"; }; }; }; readonly OBJECT2: { readonly properties: { readonly prop2: { readonly value: "b"; }; }; }; }[OBJECT_KEY]["properties"][PROPERTY_NAME]'.

考虑到属性的形状相同,是否有任何方法可以索引每个对象的属性?我可以将其强制放入接口(interface)中,但我想保留值的强类型。

最佳答案

这很可能是 TypeScript 中的错误或设计限制;编译器无法识别通用对象将具有文字键。这是对 typeof OBJECTS[K]["properties"][P] 的推断约束的问题。请参阅microsoft/TypeScript#21760了解更多信息(如果您希望有一天能看到它得到处理,也许可以给它一个👍,但它看起来前景并不乐观,因为截至 2020 年 5 月,它已经闲置了两年多)。

处理此问题的一种方法是使类型函数更加通用(而不是 typeof OBJECTS,而是使用通用类型 T,该类型明确约束为具有以下结构的内容我们正在访问),然后将其专门化为 typeof OBJECTS:

type GenericPropertiesForObject<
T extends Record<K, { properties: { [k: string]: { value: any } } }>,
K extends PropertyKey
> = {
[P in keyof T[K]["properties"]]: T[K]["properties"][P]["value"]
};

type PropertiesForObject<K extends keyof typeof OBJECTS> =
GenericPropertiesForObject<typeof OBJECTS, K>;

即使它执行的计算本质上相同,但编译时不会出现错误。让我们确保它有效:

type O1Props = PropertiesForObject<'OBJECT1'>;
// type O1Props = { readonly prop1: "a"; }

type O2Props = PropertiesForObject<'OBJECT2'>;
// type O2Props = { readonly prop2: "b"; }

我觉得不错。好的,希望有帮助;祝你好运!

Playground link to code

关于TypeScript:使用 keyof 索引对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61941672/

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