如何在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
相关产品推荐
相关产品推荐

