网站搜索

我可以使用 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;
}