【发布时间】:2020-06-17 03:30:54
【问题描述】:
type Tail<T extends any[]> = ((...t: T) => void) extends ((
h: any,
...r: infer R
) => void)
? R
: never;
type DeepOmit<T, Path extends string[]> = T extends object
? {
0: Omit<T, Path[0]>;
1: {
[K in keyof T]: K extends Path[0] ? DeepOmit<T[K], Tail<Path>> : T[K];
};
}[Path['length'] extends 1 ? 0 : 1]
: T;
我有上述类型,效果很好。我是这样测试的:
type A = DeepOmit<{ a: { b: { c: 1 } } }, ['a', 'b', 'c']>;
// {
// a: {
// b: Pick<{
// c: 1;
// }, never>;
// };
// }
但是,当我在函数中添加它时,我没有得到想要的输出。
const del = <T extends object, K extends string[]>(src: T, path: K) => {
// custom logic removed. just creating the result below.
const result = {
a: {
b: {}
}
}
return result as DeepOmit<T, K>
};
const deletedObj = del({a:{b:{c:1}}},["a","b","c"]);
// deletedObj.a.b.c <========== still works
// expected is deletedObj.a.b
谁能指出这里有什么问题?
【问题讨论】:
标签: typescript typescript-generics