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

如何让Object.fromEntries()返回精确的类型定义?

解决Object.fromEntries的精确类型推断问题

当前使用Object.fromEntries转换条目数组时,TypeScript默认会推断出宽泛的{[k: string]: number}类型,无法识别具体的键名。要让返回值拥有精确类型——键完全匹配TransformedProperties返回的键,值类型固定为number,可以通过以下方式实现:

关键步骤与代码示例

  1. 保留条目数组的字面量类型
    给TransformedProperties的返回值添加as const,让TypeScript保留数组元素的字面量类型,而非自动拓宽为string和number:

    function TransformedProperties() {
      return [
        ['time_worked', 10],
        ['other_property_one', 1],
        ['other_property_two', 0],
      ] as const;
    }
    
  2. 提取键的字面量类型
    用泛型工具类型从TransformedProperties的返回值中提取所有键的类型:

    type GetTransformedKeys<T extends () => readonly [string, number][]> = 
      ReturnType<T>[number][0] extends infer K ? K extends string ? K : never : never;
    
  3. 生成精确的返回类型
    在transform函数中,给Object.fromEntries指定精确的返回类型:

    function transform() {
      const entries = TransformedProperties();
      return Object.fromEntries(entries) as Record<GetTransformedKeys<typeof TransformedProperties>, number>;
    }
    

效果验证

调用transform后,返回值的类型会被精确推断为:

{
  time_worked: number;
  other_property_one: number;
  other_property_two: number;
}

此时TypeScript会自动提示这些键名,并且能检查类型的正确性。

替代方案:封装类型安全的fromEntries

如果不想使用类型断言,可以自己封装一个自动推断精确类型的工具函数:

function typedFromEntries<K extends string | number | symbol, V>(entries: readonly [K, V][]) {
  return Object.fromEntries(entries) as Record<K, V>;
}

function transform() {
  const entries = TransformedProperties();
  return typedFromEntries(entries);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:27:34