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

如何在TypeScript中获得带类型的Object.entries()与Object.fromEntries()?

实现方案

直接通过TypeScript高级泛型封装两个工具方法即可,运行时复用原生API,仅做类型增强:

1. 类型定义与实现

// 实现 Typed Object.entries
function getTypedObjectEntries<T extends object>(obj: T): Array<{ [K in keyof T]: [K, T[K]] }[keyof T]> {
  return Object.entries(obj) as any;
}

// 实现 Typed Object.fromEntries 所需的前置类型转换
type EntriesToObject<T extends ReadonlyArray<readonly [PropertyKey, unknown]>> = {
  [K in T[number][0]]: Extract<T[number], readonly [K, unknown]>[1]
};
function createTypedObjectFromEntries<T extends ReadonlyArray<readonly [PropertyKey, unknown]>>(entries: T): EntriesToObject<T> {
  return Object.fromEntries(entries) as any;
}

2. 效果验证

场景1:Typed Object.fromEntries(entries)

const myArrayOfPairs = [["a", 5], ["b", "hello"], ["c", false]] as const;
// myTypedObject 类型自动推导为 { readonly a: 5; readonly b: "hello"; readonly c: false; }
const myTypedObject = createTypedObjectFromEntries(myArrayOfPairs); 

场景2:Typed Object.entries(obj)

const myOldObject = {
    x: 6,
    y: "apple",
    z: true
};
// myTypedEntries 类型自动推导为 (["x", number] | ["y", string] | ["z", boolean])[]
const myTypedEntries = getTypedObjectEntries(myOldObject);

注意事项

  • 使用createTypedObjectFromEntries时,输入的键值对数组需要加as const断言,才能推导到字面量级别的精确类型,如果不加断言会推导为键对应值的宽类型(如{a: number, b: string})
  • 如果处理的对象包含可选属性、索引签名等特殊结构,可根据需要扩展泛型约束适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:15:04