返回通用类型的“类型”

时间:2018-10-23 17:51:40

标签: typescript

我有一个不变的克隆函数:

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)。这可能吗?

1 个答案:

答案 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),但是基本上不能推断出它实际上是同一类型。因此,我们必须通过手动确认类型来使其平静下来。