Typescript子类中的方法重载
我的想法很简单:Typescript子类中的方法重载,typescript,Typescript,我的想法很简单: class A { getSomething(name: string): number { return 1; } } class B extends A { getSomething(n: number, name: string): number { return 2; } } 在一个类中定义的方法应使用子类中的附加参数重载。实际上,B类中的方法将根据新参数绕行到A。但是,我得到了一个错误: 类“B”
class A {
getSomething(name: string): number {
return 1;
}
}
class B extends A {
getSomething(n: number, name: string): number {
return 2;
}
}
在一个类中定义的方法应使用子类中的附加参数重载。实际上,B类中的方法将根据新参数绕行到A。但是,我得到了一个错误:
类“B”错误地扩展了基类“A”。财产类型
“getSomething”不兼容。
Type'(n:number,name:string)=>number'不可分配给Type'(name:string)=>number'
请参阅中的代码。这里的正确方法是什么?这可能吗?您可以显式声明重载函数签名:
class A {
getSomething(name: string): number {
return 1;
}
}
class B extends A {
getSomething(name: string): number;
getSomething(n: number, name: string): number;
getSomething(n, name?) {
return 2;
}
}
编辑
通过上述操作,您也可以覆盖原始函数。当参数以这种方式给定时,调用超类函数是您的责任。例如:
class A {
getSomething(name: string): number {
return 1;
}
}
class B extends A {
getSomething(name: string): number;
getSomething(n: number, name: string): number;
getSomething(n: any, name?: any): any {
if (typeof name !== "string") {
return super.getSomething(n);
}
return 2;
}
}
不编译但不工作
getSomething(“blah”)
也将在B中结束(并返回2),但是它应该在A中使用实现(并返回1)。否则我们会隐藏函数,而不是重载。@MikeLischke这是我们想要的行为。这就是TypeScript中重载的工作方式。您有多个签名,但只有一个实现,实现者负责为正确的输入提供正确的类型。这是从JavaScript继承而来的。哦,那么我认为它的名称是错误的。我们需要找到一种不同的方法。无论如何谢谢你。@MikeLischke你说得有点对。我用一些代码更新了答案,这可能会对您有所帮助。否则您将不得不使用不同的函数名。是的,这主意不错,但不可行(不允许有任何隐式)。另一个名字可能是我唯一的选择。