扩展类中具有不同参数类型的替代方法-Typescript

A_A*_*A_A 6 inheritance class-method typescript

我想重写一个方法,并将不同的参数类型传递给它:

class Base {
    public myMethod(myString: string): undefined {
        return;
    }
}

class Child extends Base {
    public myMethod(myNumber: number): undefined {
        return super.myMethod(String(myNumber));
    }
}
Run Code Online (Sandbox Code Playgroud)

但这会产生打字错误:

类型'Child'的属性'myMethod'不能分配给基本类型'Base'的相同属性。类型'(myNumber:number)=> undefined'不能分配给类型'(myString:string)=> undefined'。参数“ myNumber”和“ myString”的类型不兼容。“字符串”类型不可分配给“数字”类型。

有没有一种方法而不会产生打字稿错误?

Rya*_*ugh 5

无法执行此操作*。在TypeScript中,继承隐含了subtyping,因此您不能从基类继承而不是它的有效子类型。

* 从技术上讲,这不是真的,但我不会提及它们,因为它们是您不应该做的骇人听闻的骇客。


Tit*_*mir 5

正如其他人所提到的,这不是一个好主意,因为您破坏了 Liskov 替换。

您可以轻松做的是提供一个覆盖stringnumber。这允许您的类仍然可以在需要基类的任何地方使用。

class Base {
     public myMethod(myString: string): undefined {
         return;
     }
 }

class Child extends Base {
    public myMethod(myNumberOrString: number | string): undefined {
        if (typeof myNumberOrString === 'number') {
            return super.myMethod(String(myNumberOrString));
        } else {
            return super.myMethod(myNumberOrString);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)