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你说得有点对。我用一些代码更新了答案,这可能会对您有所帮助。否则您将不得不使用不同的函数名。是的,这主意不错,但不可行(不允许有任何隐式)。另一个名字可能是我唯一的选择。