如何检查,函数参数类型是否等于其中一个自定义接口?

时间:2017-06-27 12:25:43

标签: typescript

我的界面:

subscribe( handler: ClientHeightEventHandlerType ): void;

subscribe( handler: ClientWidthEventHandlerType  ): void;

重载列表:

subscribe(handler: any  /**callback function*/): void {


   //How to check, is 'handler' argument type is equal to 
   //ClientHeightEventHandlerType or ClientWidthEventHandlerType
   //...


}

我需要检查函数是函数参数是否等于其中一个接口:

{{1}}

如何进行此项检查? 我已经尝试过警卫,但据我所知,在这种情况下他们无法帮助我。

1 个答案:

答案 0 :(得分:1)

请勿使用any 您的签名应如下所示:

subscribe(handler: (event: {clientHeight: number} | {clientWidth: number}) => void): void {
    ...
}

更直观的签名:

subscribe(handler: ClientHeightEventHandlerType | ClientWidthEventHandlerType): void

无法工作,因为当您尝试使用此错误调用handler函数时,编译器会抱怨:

  

无法调用类型缺少调用签名的表达式。   键入' ClientHeightEventHandlerType | ClientWidthEventHandlerType'没有   兼容的呼号。

修改

您无法在运行时区分这两种类型 你能做的是:

(1)添加"类型"到界面:

interface ClientHeightEventHandlerType {
    type: "ClientHeightEventHandlerType";
    handler: (event: {clientHeight: number}) => void;
}

interface ClientWidthEventHandlerType {
    type: "ClientWidthEventHandlerType";
    handler: (event: {clientWidth: number}) => void;
}

然后使用类型防护来检查已经传递的内容。

(2)在函数中添加一个类型:

subscribe(type: "ClientHeightEventHandlerType", handler: ClientHeightEventHandlerType): void;
subscribe(type: "ClientWidthEventHandlerType", handler: ClientWidthEventHandlerType): void;
subscribe(type: "ClientHeightEventHandlerType" | "ClientWidthEventHandlerType", handler: (event: {clientHeight: number} | {clientWidth: number}) => void): void {
    ...
}