我有一个以字符串作为键的对象。但是,我不希望它是字符串。我希望键字符串是对象的确切值。我还必须输入该对象的值以遵循某些规则。这是一个例子,
type ObjectValueType = {
checked: boolean;
fields: Path<Camera>[];
};
type ObjectType = Record<string, ObjectValueType>;
const Object: ObjectType = {
camera_stream_endpoint: {
checked: false,
fields: ['camera_stream_endpoint'],
},
layout_image: {
checked: false,
fields: ['layout_image'],
},
};
在上面的对象中,我创建了一个打字稿类型
ObjectType
,其中string
为key
,ObjectValueType
为value
。我不希望 key
成为 string
。我希望 key
成为 Object
的精确键(camera_stream_endpoint 或layout_image 或rest)。我如何推断这个key
?
我不想创建对象键的联合类型,因为该对象是一个非常长的对象,具有很多键。因此,我更喜欢 TypeScript 从创建的对象中推断出该键。
我尝试过的一件事是使用断言
as const
像这样
const Object = {
camera_stream_endpoint: {
checked: false,
fields: ['camera_stream_endpoint'],
},
layout_image: {
checked: false,
fields: ['layout_image'],
},
} as const;
以上实现了按键的预期结果。但是,现在,我可以为
value
添加任何我想要的内容。例如,我很容易搞乱应该遵循定义类型 fields
的 Path<Camera>
。 TypeScript 根本不会抱怨错误的值。
我想输入对象的键和值。键应该从创建的变量中推断出来,值将有自己的类型定义。可以吗?
我可以提供一个我认为不是最佳但似乎可行的解决方案,您可以从 const 对象推断键,定义您需要的类型,然后将 const 对象分配给所需类型的变量:
type ObjectValueType = {
checked: boolean;
fields: Path<Camera>[];
};
const ConstObject = {
camera_stream_endpoint: {
checked: false,
fields: ['camera_stream_endpoint'],
},
layout_image: {
checked: false,
fields: ['layout_image'],
},
};
export type ObjectTypes = keyof typeof ConstObject;
export const Object: { [key in ObjectTypes]: ObjectValueType } = ConstObject;