遍历键类型为`${number}`的对象时,如何让键保留该类型而非string?
TypeScript中让数字模板字符串索引对象的遍历键类型匹配的最佳方式
当你定义了用${number}作为索引的对象类型后,使用for-in遍历时键会被推断为string,这是因为JavaScript里对象的键本质都是字符串,TypeScript的模板字符串索引只是类型层面的约束,运行时无法直接识别。以下是几种安全且符合规范的解决方法:
方法一:将Object.keys结果断言为目标类型后遍历
利用Object.keys获取键数组,再通过类型断言将其转为${number}[]——因为你的类型已经严格约束了所有键都是数字格式的字符串,这个断言是安全的,不属于不良实践:type Thing = { [prop: `${number}`]: string }; const thing: Thing = { "1": "foo", "2": "bar" }; const keys = Object.keys(thing) as `${number}`[]; for (const prop of keys) { // 此处prop的类型为 `${number}` console.log(prop, thing[prop]); }方法二:封装类型安全的遍历函数
如果需要多次遍历这类对象,可以封装一个专用函数,把类型断言的逻辑集中起来,避免重复代码:function iterateThingKeys(thing: Thing, handler: (key: `${number}`) => void) { for (const key in thing) { handler(key as `${number}`); } } // 使用示例 iterateThingKeys(thing, (prop) => { // prop的类型为 `${number}` console.log(prop, thing[prop]); });
需要注意的是,只要你的Thing类型严格保证了所有键都符合${number}的格式,上述的类型断言就是完全安全的——TypeScript的类型系统已经帮你在编译时做了校验,运行时不会出现不符合格式的键。
内容的提问来源于stack exchange,提问作者Jerezle
相关产品推荐
相关产品推荐

