You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用typeof、keyof定义带计算属性的Type时遇错误,求正确实现

解决TypeScript映射类型的"属性缺失"错误

咱们先一步步拆解问题,从根源到解决方案理清楚:

1. 先修正Options的定义问题

你原来的Options里的类型断言有明显错误,比如option2: 'option1' as 'options2'——值是'option1'但断言成'options2',这会导致TypeScript对值的类型推断完全混乱。更简洁且正确的做法是用as const断言整个对象,让TypeScript自动推断每个属性值的字面量类型:

const Options = {
  option1: 'option1',
  option2: 'option2',
  option3: 'option3',
} as const; // 关键:让所有值变成精确的字面量类型,而非宽泛的string

2. 确认Option类型的正确性

现在生成Option类型就能得到准确的联合类型:

type Option = typeof Options[keyof typeof Options];
// 此时Option的类型是:'option1' | 'option2' | 'option3'

3. 解决Dropdown类型的"属性缺失"错误

你定义的type Dropdown = { [key in Option]: string }是必填的映射类型——这意味着任何符合Dropdown类型的对象,必须包含所有Option中的键。所以当你只提供{ [Options.option1]: string }时,TypeScript会报错说缺少其他属性。

根据你的业务需求,有两种解决方式:

方式一:让Dropdown的属性变为可选(允许只包含部分选项)

如果你的场景不需要强制包含所有选项,只需要给映射类型的属性加?标记为可选:

type Dropdown = { [key in Option]?: string };

这样你写{ [Options.option1]: '测试值' }就完全符合类型要求了,其他属性可以按需添加。

方式二:强制包含所有选项(如果业务需要必须全量)

如果你的业务逻辑要求必须包含所有选项,那就要确保对象里有每个Option对应的键:

const validDropdown: Dropdown = {
  [Options.option1]: '选项1的值',
  [Options.option2]: '选项2的值',
  [Options.option3]: '选项3的值',
};

这样就不会触发属性缺失的错误了。

内容的提问来源于stack exchange,提问作者Mosh Feu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:39:33