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

TypeScript中如何将for...of遍历的键用作类型化对象的索引?

TypeScript中Object.entries遍历类型化对象的索引类型错误解决方法

当使用Object.entries遍历像Composition这样的明确类型对象时,TypeScript会把遍历得到的键识别为string类型,但原类型并没有定义字符串索引签名,导致直接用该键赋值时触发类型错误。以下是几种实用的解决方法:

方法一:类型断言收缩键类型

直接将遍历得到的键断言为目标类型的键集合(keyof Composition),让TypeScript确认该键是对象的有效属性:

type Composition = {
  foo: number;
  bar: number;
};

const total = 4;
const composition: Composition = { foo: 3, bar: 1 };

for (const [key, value] of Object.entries(composition)) {
  composition[key as keyof Composition] = (value / total) * 100;
}

方法二:为类型添加字符串索引签名

如果允许对象存在其他数值类型的属性,可以给Composition类型添加字符串索引签名,这样任意字符串键都会被TypeScript认可:

type Composition = {
  foo: number;
  bar: number;
  [key: string]: number; // 新增字符串索引签名
};

const total = 4;
const composition: Composition = { foo: 3, bar: 1 };

for (const [key, value] of Object.entries(composition)) {
  composition[key] = (value / total) * 100;
}

注意:这种方式会放宽类型约束,允许对象添加foo和bar之外的其他数值属性。

方法三:用类型守卫验证键的有效性

通过自定义类型守卫函数,在运行时验证键是否属于目标类型的有效属性,TypeScript会在验证通过的代码块内自动收缩键的类型:

type Composition = {
  foo: number;
  bar: number;
};

const total = 4;
const composition: Composition = { foo: 3, bar: 1 };

// 自定义类型守卫函数
function isCompositionKey(key: string): key is keyof Composition {
  return ['foo', 'bar'].includes(key);
}

for (const [key, value] of Object.entries(composition)) {
  if (isCompositionKey(key)) {
    composition[key] = (value / total) * 100;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:30:10