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
相关产品推荐
相关产品推荐

