在实际的项目中,经常遇到从对象中摘取某些字段形成新对象的需求,对此小伙伴们想必也有自己的一套方法来实现。为了加深理解,记录下我自己的实现。
pick
// 从对象中选出相应字段,生成新对象
function pick<T extends Record<string,any>, P extends keyof T>(obj: T, args: P[]) {
const newObj = {} as Pick<T, P>
args.forEach((key) => {
if (obj[key] !== undefined) newObj[key] = obj[key]
})
return newObj
}
omit
// 从对象中排除相应字段,生成新对象
function omit<T extends Record<string,any>, P extends keyof T>(obj: T, args: P[]) {
const newObj = {} as Omit<T, P>
// 这里的 includes 使用“item as P”,使前后类型一致
const keys = Object.keys(obj).filter((item) => !args.includes(item as P)) as Exclude<keyof T, P>[]
keys.forEach((key) => {
if (obj[key] !== undefined) newObj[key] = obj[key]
})
return newObj
}