【问题标题】:Method overloading in descendent classes in TypescriptTypescript中后代类中的方法重载
【发布时间】:2017-02-01 01:31:57
【问题描述】:

我的想法很简单:

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' 不兼容。 类型 '(n: number, name: string) => number' 不可分配给类型 '(name: string) => number'。

playground 中查看此代码。这里的正确方法是什么?这可能吗?

【问题讨论】:

    标签: typescript


    【解决方案1】:

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

    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 你说得对。我用一些可能对您有所帮助的代码更新了答案。否则你将不得不使用不同的函数名。
    • 是的,好主意,但不可行(不允许任何暗示)。一个不同的名字可能是我唯一的选择。
    猜你喜欢
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    相关资源
    最近更新 更多