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

TypeScript使用字符串key索引对象报ts(7053)错误如何解决?

报错原因

TypeScript抛出该错误是因为你的formatters对象没有声明string类型的索引签名,默认只允许使用已定义的time、date、stringUpperCase等明确存在的key索引,任意string类型的type参数无法保证是对象的合法key,因此触发类型校验规则。

解决方案

下面按推荐优先级给出三种可选方案:

方案1:限制type参数为合法key类型(最推荐)

直接将函数的入参type限制为formatters已有的key联合类型,编译阶段就可以拦截非法参数传入,完全规避运行时不匹配问题,代码示例:

// 提取formatters所有合法key的联合类型
type FormatterType = keyof typeof formatters

function getFormattedValue(type: FormatterType): string {
  const formatter = formatters[type] || formatters.stringUpperCase
  // 后续业务逻辑
}

方案2:增加运行时key合法性校验

如果type参数来源不可控(比如来自后端接口返回、用户输入),无法提前限制类型,可以先做运行时判断再结合类型断言兼容:

function getFormattedValue(type: string): string {
  const formatter = Object.hasOwn(formatters, type)
    ? formatters[type as keyof typeof formatters]
    : formatters.stringUpperCase
  // 后续业务逻辑
}

方案3:给formatters添加string索引签名

如果后续需要动态新增格式化函数,可直接给formatters声明通用的索引签名,无需修改入参类型:

// 先定义格式化函数的统一类型
type FormatterFn = (value: string) => string

const formatters: Record<string, FormatterFn> = {
  time(value: string): string {
    const serialized = moment(value, dateTimeFormat, true);
    return serialized.format('MMM Do YYYY HH:mm');
  },
  date(value: string): string {
    const serialized = moment(value, 'YYYY-MM-DD', true);
    return serialized.format('MMM Do YYYY');
  },
  stringUpperCase(value: string): string {
    return value.toUpperCase();
  },
  // ...
}

注意该方案会损失部分类型校验能力:如果手动拼写错误的key名,TypeScript不会在编译阶段抛出提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:36:01