使用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
相关产品推荐
相关产品推荐

