如何区分类型和功能?
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<T>
给出一个布尔值 AND 将推断返回类型。
请注意,我添加了泛型,可能不合适,因此在这种情况下删除它们。
【讨论】:
不幸的是typeof SomeType
返回"function"
,因为Type extends Function
(我说的是来自@angular/core
的Type
接口)
我明白了,所以没有干净的方法来进行检查。一个解决方案可能是将TypeFn
包装在一个对象中,或者任何可以区分它的东西。【参考方案2】:
(回调类型===“函数”)
我会检查它是否是一个函数,然后用“else”为另一种类型做一些事情。
【讨论】:
以上是关于如何区分类型和功能?的主要内容,如果未能解决你的问题,请参考以下文章