TypeScript使用字符串键访问对象属性时遇类型错误求助
解决TypeScript中字符串键访问对象属性的类型错误
你的代码存在两个核心问题:一是TypeScript无法推断prop${i}属于MyObject的合法键类型;二是initialValues未完整初始化接口要求的所有属性,且数组中包含了不存在的prop6键。以下是两种可行的修复方案:
方案一:直接使用合法键数组
先定义包含所有目标键的数组,并用keyof MyObject约束数组元素类型,确保每个键都符合接口定义:
interface MyObject { prop1: string; prop2: string; prop3: string; prop4: string; prop5: string; } // 完整初始化对象,满足接口的所有属性要求 let initialValues: MyObject = { prop1: 'xxxx', prop2: 'yyyy', prop3: '', prop4: '', prop5: '' }; // 用keyof MyObject确保数组元素都是合法键 const targetKeys: (keyof MyObject)[] = ['prop3', 'prop4', 'prop5']; targetKeys.forEach(key => { initialValues[key] = 'zzzz'; });
方案二:类型断言配合合法索引范围
如果需要通过数字生成键名,先确保数字范围对应合法的键,再通过类型断言告诉TypeScript生成的字符串是合法键:
interface MyObject { prop1: string; prop2: string; prop3: string; prop4: string; prop5: string; } // 完整初始化对象 let initialValues: MyObject = { prop1: 'xxxx', prop2: 'yyyy', prop3: '', prop4: '', prop5: '' }; // 移除无效的6,只保留对应合法键的数字 [3,4,5].forEach(i => { // 断言生成的键属于MyObject的键类型 const key = `prop${i}` as keyof MyObject; initialValues[key] = 'zzzz'; });
关键说明
- 完整初始化对象:TypeScript要求接口类型的对象必须包含所有属性,不能只初始化部分,因此需要给未赋值的属性设置初始值(比如空字符串)。
- 约束键类型:通过
keyof MyObject可以获取接口的所有键类型,让TypeScript确认你使用的键是合法的,避免隐式any类型错误。 - 移除无效键:数组中的
6对应不存在的prop6,必须移除,否则会违反接口定义,导致对象出现多余属性。
内容的提问来源于stack exchange,提问作者pinale
相关产品推荐
相关产品推荐

