实现 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;
}