在Typescript中的后代类中重载方法

我想到的很简单:

class A {
    getSomething(name: string): number {
        return 1;
    }

 }

class B extends A {
    getSomething(n: number, name: string): number {
        return 2;
    }
}

在一个类中定义的方法应该在后代类中使用附加参数进行重载 . 实际上,B类中的方法将根据新参数绕道而行 . 但是,我收到错误:

类'B'错误地扩展了基类'A' . 属性'getSomething'的类型不兼容 . 类型'(n:number,name:string)=> number'不能分配给'(name:string)=> number' .

请参阅playground中的此代码 . 这里的正确方法是什么?这有可能吗?

回答(1)

2 years ago

您可以显式声明重载的函数签名:

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;
    }
}

EDIT

使用上面的内容,您也可以覆盖原始功能 . 当参数以这种方式给出时,您有责任调用超类函数 . 一个例子:

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;
    }
}