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

遍历键类型为`${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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:43:18