跳到主要内容

实现 Pick

function pick(target={}, keys) {
let result = {};
Object.keys(target).map((el) => {
if (keys.includes(el)) {
result[el] = target[el];
}
});
return result;
}
var result = pick({ a: "1", b: "2", c: 3 }, ["a", "c"]);
// => { 'a': 1, 'c': 3 }

ts

简单版

function pick(target:object={}, keys:string[]):object {
let result = {};
Object.keys(target).map((el) => {
if (keys.includes(el)) {
result[el] = target[el];
}
});
return result;
}

分析

可以使用泛型,针对 object 做如下改造

function pick<T extends object>(target:T={}, keys:string[]):T {
let result:T = {};
Object.keys(target).map((el) => {
if (keys.includes(el)) {
result[el] = target[el];
}
});
return result;
}

然后使用 keyof 方法,遍历 T 对象的 key

function pick<T extends object>(target:T={}, keys:(keyof T)[]):T {}

其次,再利用泛型的多类型参数:

function pick<T extends object, U extends keyof T>(target: T = {}, keys:U[]):T {}

最后再改造一下返回值:

type Pick<T extends object, U extends keyof T> = {
[key in U]: T[key]
}

进阶版

type Pick
function pick<T extends object, U extends keyof T>(target:T={}, keys:U[]):{
[P in U]: T[P]
} {
let result:{} = {};
Object.keys(target).map((key: string) => {
if (keys.includes(key)) {
result[key] = target[key];
}
});
return result;
}