首页 > 解决方案 > 如何根据数组中的值创建带有键的接口

问题描述

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

我该如何在打字稿中输入这个对象?我想使用从数组派生的接口初始化新对象,或者至少能够正确键入返回的对象。我可能会这样做,并且可能有更好的方法可以做到这一点,但是有什么建议吗?

    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
    }

标签: typescript

解决方案


受定义的启发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 参数中的类型安全性和正确推断的返回类型。

游乐场链接


推荐阅读