我经常需要从对象中提取属性
const obj = {a:1, b: 2, c: 3};
const plucked = pluck(obj, 'a', 'b'); // {a: 1, b:2}
但是,如果您想要类型安全,这在TypeScript中并不容易,因为我无法在TypeScript's manual上找到TypeScript中具有以下签名的函数。
declare function pick<T, K extends keyof T>(obj: T, ...keys: K[]): Pick<T, K>;
我无法获得编译的版本,这是我尝试过的版本:
function pluck<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {
// Type '{}' is not assignable to type 'Pick<T, K>'.
const ret: Pick<T, K> = {};
for (let key of keys) {
ret[key] = obj[key];
}
return ret;
}
这是否意味着我需要使用环境声明并在JS中声明该函数?
答案 0 :(得分:3)
我最终在我操作的对象上使用any
,而TypeScript很高兴允许它作为返回值。 See it in action
function pluck<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {
const ret: any = {};
for (let key of keys) {
ret[key] = obj[key];
}
return ret;
}
const less = pluck({ a: 1, b: '2', c: true }, ['a', 'c']);
答案 1 :(得分:2)
这是另一种选择:
function pluck<T, K extends keyof T>(objs: T, keys: K[]): Pick<T, K> {
return keys.reduce((result, key) =>
Object.assign(result, {[key as string]: objs[key]}), {}) as Pick<T, K>;
}