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

如何在Typescript中正确访问自定义类型的属性值

错误原因

你遇到的报错是因为 Object.keys() 方法在Typescript的类型定义中返回值固定为string[]类型,而你定义的Notes类型只允许5、10、20三个字面量作为键,用宽泛的string类型去索引明确限定了键范围的类型,就会触发该类型错误。

解决方案

方案1:对Object.keys的返回值做类型断言(最常用)

你可以直接告诉Typescript,你确认availableNotes的所有键都属于Notes类型的合法键,把返回值断言为Array<keyof Notes>即可:

// 把返回的string数组断言为Notes的键组成的数组
const noteTypes = Object.keys(availableNotes) as Array<keyof Notes>;

for(let i = 0; i < noteTypes.length; i++) {
  const value = availableNotes[noteTypes[i]]; 
  // 这里value会被自动推导为number类型,不会报错
}

方案2:用Object.entries直接遍历键值对

如果你的遍历场景需要同时拿到键和值,可以直接对Object.entries的返回值做类型断言,写法更简洁:

const entries = Object.entries(availableNotes) as Array<[keyof Notes, number]>;
for (const [key, value] of entries) {
  // 直接拿到类型正确的key和value,直接使用即可
}

方案3:自定义类型守卫(适合类型不确定的严谨场景)

如果你不能完全保证Object.keys返回的键都是合法的,可以加一层类型判断做类型收窄,完全避免类型风险:

// 先定义类型守卫判断传入值是否是Notes的合法键
function isNoteKey(key: string): key is keyof Notes {
  return ['5', '10', '20'].includes(key);
}

const noteTypes = Object.keys(availableNotes);
for(let i = 0; i < noteTypes.length; i++) {
  const key = noteTypes[i];
  if (isNoteKey(key)) {
    const value = availableNotes[key];
    // 进入if分支后key的类型已经被收窄为keyof Notes,不会报错
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:36:07