如何只输入值并让 TypeScript 推断对象的键?

问题描述 投票:0回答:1

我有一个以字符串作为键的对象。但是,我不希望它是字符串。我希望键字符串是对象的确切值。我还必须输入该对象的值以遵循某些规则。这是一个例子,

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 根本不会抱怨错误的值。

我想输入对象的键和值。键应该从创建的变量中推断出来,值将有自己的类型定义。可以吗?

typescript
1个回答
0
投票

我可以提供一个我认为不是最佳但似乎可行的解决方案,您可以从 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;
© www.soinside.com 2019 - 2024. All rights reserved.