我的界面:
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}}
如何进行此项检查? 我已经尝试过警卫,但据我所知,在这种情况下他们无法帮助我。
答案 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 {
...
}