如何检查,是函数参数类型等于自定义接口之一



我的接口:

interface ClientHeightEventHandlerType{
    (event: {clientHeight: number}): void;
}
interface ClientWidthEventHandlerType{
    (event: {clientWidth: number}): void;
}

超载列表:

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
   //...

}

如何进行此支票?我已经尝试了警卫,但是正如我所知,在这种情况下他们不会帮助我。

不使用 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 {
    ...
}

最新更新