如何基于数组中的值创建具有键的接口



我有一个函数,它接收一个对象和一个字符串数组。然后,它返回一个新对象,该对象只包含在所述数组中指定的原始对象中的键。

如何在typescript中键入此对象?我想用从数组派生的接口初始化新对象,或者至少能够正确地键入返回的对象。我可能会这样做,而且可能有更好的方法来做这件事,但有什么建议吗?

function myFunction(person: Person, wantedKeys: string[]) {    
const wantedObject = {} as any; // <-- current workaround
wantedKeys.forEach(key => (wantedObject[key] = person[key]));
return wantedObject as Object; // <-- current workaround needs typing
}

Pick<T, K>定义的启发,我相信以下功能满足您的要求:

const pickObj = <T, K extends keyof T>(obj: T, keys: readonly K[]): { [P in K]: T[P] } =>
Object.fromEntries(keys.map(k => [k, obj[k]])) as { [P in K]: T[P] };

现在您可以:

const myObj = {
a: "a",
b: "b",
c: "c"
}
const newObj = pickObj(myObj, ["a", "b"])
console.log(newObj)
/* 
{
"a": "a",
"b": "b"
} 
*/

享受keys参数中的类型安全性和正确推断的返回类型。

游乐场链接

最新更新