如何区分类型和功能?

Posted

技术标签:

【中文标题】如何区分类型和功能?【英文标题】:How to tell apart Type from Function? 【发布时间】:2019-12-28 01:58:57 【问题描述】:

我有一个类型的参数

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

如果它是一个我需要调用它的函数,否则只需按原样使用类型

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

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

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 或类似的方式将它们区分开来。

【问题讨论】:

我认为 Angular 不应该成为类型检查的资源,特别是因为您已经在使用 Typescript。要么使用instanceof 运算符,要么使用返回Type is SpecificType 的函数进行某种鸭式输入,这将满足编译器的要求。请参阅this question 了解更多信息。 【参考方案1】:
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&lt;T&gt; 给出一个布尔值 AND 将推断返回类型。

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

【讨论】:

不幸的是typeof SomeType返回"function",因为Type extends Function(我说的是来自@angular/coreType接口) 我明白了,所以没有干净的方法来进行检查。一个解决方案可能是将TypeFn 包装在一个对象中,或者任何可以区分它的东西。【参考方案2】:

(回调类型===“函数”)

我会检查它是否是一个函数,然后用“else”为另一种类型做一些事情。

【讨论】:

以上是关于如何区分类型和功能?的主要内容,如果未能解决你的问题,请参考以下文章

C++ template —— 类型区分

关于R语言的数据类型和数据结构的如何区分

如何区分 TypeScript 重载中的类型对象和数组?

F#如何在递归可区分联合中指定类型限制

如何使用 find_system() 区分子系统和 MATLAB 功能块

如何区分 MFC(VC++)中的文件夹类型(Windows/FTP)?