我的接口:
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 {
...
}