如何区分类型和功能?

时间:2019-08-22 17:36:27

标签: angular typescript

我的参数类型为

((element: any) => Type<any>) | Type<any>

如果它是一个函数,我需要调用它,否则明智的做法是按原样使用Type

getType(element: any, type: ((element: any) => Type<any>) | Type<any>): Type<any> {
    return isFunctionNotType(type) ? type(element) : type;
}

不幸的是,我不确定如何编写isFunctionNotType方法。 isType中有一个@angular/core/src/type方法,但是每当我尝试使用该方法时,在编译过程中都会收到以下错误消息

ERROR in C:/Users/xxxxxx/xxxxxx/xxxxxx/dist/xxxxxx/fesm5/angular-utils.js
Module not found: Error: Can't resolve '@angular/core/src/type' in 'C:\Users\xxxxxx\xxxxxx\xxxxxx\dist\xxxxxx\fesm5'

是否有某种方法可以使此工作正常而不必将type变量分解为两个?

编辑:我应该指出,因为人们似乎在这里遗漏了要点。在成角度的Type中扩展了Function,在运行时您将无法仅通过执行instanceof或类似的操作来区分它们。

2 个答案:

答案 0 :(得分:0)

(typeof回调===“函数”)

我会检查它是否具有功能,然后为其他类型加上“ else”。

答案 1 :(得分:0)

type TypeFn<T> = (element: T) => Type<T>;

function isFunctionNotType<T>(type: TypeFn<T> | Type<T>): type is TypeFn<T> {
    return typeof type === 'function';
}

function getType<T>(element: T, type: TypeFn<T> | Type<T>): Type<T> {
    return isFunctionNotType(type) ? type(element) : type;
}

isFunctionNotType返回类型type is TypeFn<T>给出一个布尔值,并将推断返回类型。

请注意,我添加了泛型,可能不合适,因此在这种情况下,请删除它们。