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

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';
});

关键说明

  1. 完整初始化对象:TypeScript要求接口类型的对象必须包含所有属性,不能只初始化部分,因此需要给未赋值的属性设置初始值(比如空字符串)。
  2. 约束键类型:通过keyof MyObject可以获取接口的所有键类型,让TypeScript确认你使用的键是合法的,避免隐式any类型错误。
  3. 移除无效键:数组中的6对应不存在的prop6,必须移除,否则会违反接口定义,导致对象出现多余属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:30:43