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 参数中的类型安全性和正确推断的返回类型。
推荐阅读
- reactjs - 打包和发布 npm 模块的最简单方法是什么?
- reactjs - 下载 s3 对象时避免打开新窗口
- listview - 通过 TListView 实现 Windows 缩略图
- mysql - 不确定如何为以下任务构建 SQL 查询
- typescript - 元素隐式具有“任何”类型,因为类型“设置”
' 没有索引签名 - notepad++ - 如何搭配
[越线] 使用记事本++ 7.0 版 - php - 使用 MySQLi 回显 JOIN SQL 表的内容
- r - kable 显示 html 代码而不是 html 表格
- c++ - 无法在 Ubuntu 18.04 上将 GLFW 库与其头文件链接
- angularjs - 每行上的Angularjs多个选择框