【发布时间】:2021-04-19 00:03:46
【问题描述】:
假设我有一个任意对象:
const foo = {foo: 1, bar: 2, baz: 3};
我想删除 bar 属性。我可以使用如下函数来做到这一点:
function omission<T extends {}, K extends keyof T = keyof T>(
obj: T,
remove: K
): Omit<T, K> {
const { [remove]: _, ...without } = obj;
return without;
}
这确实从类型系统和运行时系统中删除了一个属性。耶。但我希望能够删除任意数量的道具。我希望一点递归可以解决问题,但我正在努力让它发挥作用。这是我的尝试:
export function omit<T extends {}, K extends keyof T = keyof T>(
obj: T,
...removals: K[]
) {
if (removals.length === 0) {
return obj;
}
const omitted = omission(obj, removals[0]);
const remaining = (removals.slice(1) as unknown) as Array<keyof typeof omitted>;
return remaining.length > 0 ? omit(omitted, remaining) : omitted;
}
毫不奇怪,它确实在运行时系统中工作,但类型系统放弃了。诚然,我的强制打字尝试是绝望的,但我很绝望。有谁知道如何把这个工具从车库里拿出来?
【问题讨论】:
-
除了接受每种类型作为单独的参数之外,我想不出任何可能的方法。 See this
-
作为选项
removals.reduce((a:Omit<T, K> ,c) =>{ const { [c]: _, ...without } = a; return without as Omit<T, K>}, obj)
标签: typescript