我有一个不变的克隆函数:
import { isObject, toPairs } from 'lodash';
export function cloneDeepWithoutUndefinedKeys<T>(o: T): any {
if (Array.isArray(o)) {
return o.map((el) => cloneDeepWithoutUndefinedKeys(el));
} else if (isObject(o)) {
const c: { [key: string]: any } = {};
for (const [key, value] of toPairs(o as { [key: string]: any })) {
if (value === undefined) {
continue;
}
c[key] = cloneDeepWithoutUndefinedKeys(value);
}
return c;
} else {
return o;
}
}
函数的返回必须使它any
,但我希望它是sameTypeOf(T)
。这可能吗?
答案 0 :(得分:1)
我会用这个。
export function cloneDeepWithoutUndefinedKeys<T extends any>(o: T): T {
if (Array.isArray(o)) {
return (o.map((el: any) => cloneDeepWithoutUndefinedKeys(el))) as T; // ADDED
} else if (isObject(o)) {
const c: { [key: string]: any } = {};
for (const [key, value] of toPairs(o)) {
if (value === undefined) {
continue;
}
c[key] = cloneDeepWithoutUndefinedKeys(value);
}
return c as T; // ADDED
} else {
return o
}
}
在没有进行任何修改的情况下,Typescript怀疑该函数是否确实返回相同的类型(T
),但是基本上不能推断出它实际上是同一类型。因此,我们必须通过手动确认类型来使其平静下来。