我可以使用 TypeScript 泛型从对象中过滤键吗?
我有一个有工作逻辑的过滤函数,但我不知道如何写它的类型:
export function filter<T>(object: T, ...keys: Array<keyof T>): ??? {
let index = -1;
const length = keys.length;
const result = { ...object };
while (++index < length) {
const key = keys[index];
if (key in object) delete result[key];
}
return result;
}
filter({ a: 1, b: 2 }, 'b') // { a: 1 }
Typescript 仍然认为 'b' 属性存在,所以我正在寻找一种方法来指定 keys 从 T 中被移除。
我对 Omit 很熟悉(但总体上对 Typescript 还是比较新),我认为它可能在这方面起作用,但我还没想出让它和 Array 配合的方法……
有人看到我在找的那条路吗?
(顺便提一下,filter 的具体签名并不重要,如果你有一个更利于类型安全的替代实现,我很乐意听听)
答案#1
解决方案是将 keyof T 提取到一个泛型中。这应该可行:
export function filter<T, K extends keyof T>(object: T, ...keys: Array<K>): Omit<T, K> {
let index = -1;
const length = keys.length;
const result = { ...object };
while (++index < length) {
const key = keys[index];
if (key in object) delete result[key];
}
return result;
}
