当我在typescript中为类型化/常量entries
数组或objt
对象使用Object.fromEntries(entries)
或Object.entires(obj)
时,我将类型丢失为any
或宽类型。
我可以手动分配泛型类型(例如Record<string, number>
),但设置每对/密钥的类型是繁琐的。
这是我想要的一个例子。
类型化对象.fromEntries(entries)
const myArrayOfPairs = [["a", 5], ["b", "hello"], ["c", false]] as const;
// The type of the following is "any"
const myTypelessObject = Object.fromEntries(myArrayOfPairs);
// I want the type of this one to be: { a: 5; b: "hello"; c: false; }
const myTypedObject = createTypedObjectFromEntries(myArrayOfPairs);
类型化Object.entries(obj)
const myOldObject = {
x: 6,
y: "apple",
z: true
};
// The type of the following is [string, string | number | boolean][]
const myEntries = Object.entries(myOldObject);
// I want the type of this one to be more specific.
// i.e.: (["x", number] | ["y", string] | ["z", boolean])[]
const myTypedEntries = getTypedObjectEntries(myOldObject);
2条答案
按热度按时间kg7wmglp1#
Object.Entries(obj)-- Object to Array of KeyValue对
这个比较简单。使用
[K in keyof OBJ_T]
可以得到键,OBJ_T[K]
给出相对值。下面是它的一个简单实现:
TSPlayground。注意需要
es2019
作为Configs的目标。Object.fromEntries(entries)--Object的键值对数组
这是一个更有挑战性的问题。
您需要首先使用
infer
提取内部数组对,然后使用公共UnionToIntersection
实用程序类型合并结果。这是我能想到的最好的:
TSPlayground
guicsvcw2#
现在,使用新的
const Type Parameter
在TypeScript 5上更容易实现这一点。TypeScript Playground