如何让Object.fromEntries()返回精确的类型定义?
解决Object.fromEntries的精确类型推断问题
当前使用Object.fromEntries转换条目数组时,TypeScript默认会推断出宽泛的{[k: string]: number}类型,无法识别具体的键名。要让返回值拥有精确类型——键完全匹配TransformedProperties返回的键,值类型固定为number,可以通过以下方式实现:
关键步骤与代码示例
保留条目数组的字面量类型
给TransformedProperties的返回值添加as const,让TypeScript保留数组元素的字面量类型,而非自动拓宽为string和number:function TransformedProperties() { return [ ['time_worked', 10], ['other_property_one', 1], ['other_property_two', 0], ] as const; }提取键的字面量类型
用泛型工具类型从TransformedProperties的返回值中提取所有键的类型:type GetTransformedKeys<T extends () => readonly [string, number][]> = ReturnType<T>[number][0] extends infer K ? K extends string ? K : never : never;生成精确的返回类型
在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
相关产品推荐
相关产品推荐

