我有以下代码:
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()
方法上的打字稿中遇到错误?我期望打字稿会知道,当我只传递一个类型为A
的参数时,它应该返回一个字符串。
答案 0 :(得分: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';
}
}