TypeScript 接口方法重载不起作用
我有以下代码:
class A { }
class B { }
class C { }
interface Builder {
build(paramOne: A): string;
build(paramOne: B, paramTwo: C): number;
}
class Test implements Builder {
build(a: A) {
return 'string';
}
}
为什么我在 build() 方法上会收到 TypeScript 的错误?我期望 TypeScript 能知道当我只传一个类型为 A 的参数时,它应该返回一个字符串。
答案#1
接口实现需要具有您的接口所具有的公共重载。要为方法指定实际实现,您需要使用额外的实现签名:
class A { p: string }
class B { b: string}
class C { c: string}
interface Builder {
build(paramOne: A): string;
build(paramOne: B, paramTwo: C): number;
}
class Test implements Builder {
build(paramOne: A): string;
build(paramOne: B, paramTwo: C): number;
build(paramOne: A|B, paramTwo?: C) : string | number {
return 'string';
}
}
new Test().build(new A()) // return string
new Test().build(new B(), new C()) // returns number
new Test().build(new A(), new C()) // error implementation signature is not callable directly
如果你想避免再次指定重载,你可以将函数作为成员字段而不是方法来实现,但这不太安全(我不得不使用 any 作为返回类型,以使新函数与重载兼容)。并且使用字段(在实例上分配)而不是方法(在原型上分配)会有性能方面的影响。
class Test implements Builder {
build: Builder ['build'] = function (this: Test, paramOne: A|B, paramTwo?: C) : any {
return 'string';
}
}
