首页 > 解决方案 > 类静态函数覆盖导致错误

问题描述

我有以下代码,它只是返回一个错误。

class Foo {
    public static logBar<T>(a: T): T {
        console.log(a);
        return a
    }
}

class Bar extends Foo {
    public static logBar<T extends number>(a: T): T {
        console.log(a);
        return a
    }
}
Class static side 'typeof Bar' incorrectly extends base class static side 'typeof Foo'.
   Types of property 'logBar' are incompatible.
     Type '<T extends number>(a: T) => T' is not assignable to type '<T>(a: T) => T'.
       Types of parameters 'a' and 'a' are incompatible.
         Type 'T' is not assignable to type 'number'.(2417)

最初我虽然这是一个泛型错误,但我能够用以下内容重复这一点

class Foo {
    public static logBar(a: string): string {
        console.log(a);
        return a
    }
}

class Bar extends Foo {
    public static logBar(a: number): number {
        console.log(a);
        return a
    }
}
Class static side 'typeof Bar' incorrectly extends base class static side 'typeof Foo'.
  Types of property 'logBar' are incompatible.
    Type '(a: number) => number' is not assignable to type '(a: string) => string'.
      Types of parameters 'a' and 'a' are incompatible.
        Type 'string' is not assignable to type 'number'.(2417)

打字稿中具有不同参数的静态函数是否不可重载?如果是这样,为什么其他语言一直这样做。评论中的例子。

请注意,以下确实有效

class Foo {
    public static logBar(a: string): string {
        console.log(a + 'Foo');
        return a
    }
}

class Bar extends Foo {
    public static logBar(a: string): string {
        console.log(a + 'Bar');
        return a
    }
}


Foo.logBar('hello');
Bar.logBar('world');

和结果

helloFoo
worldBar

标签: typescript

解决方案


每当使用基类的实例时,都应该能够使用子类的实例。这称为Liskov 替换原则,它要求子类的方法接受基类的相同方法接受的所有值作为输入(可能更多),并且不返回与子类的相同方法相同的值。基类不能返回。同样的原则也防止子类限制从基类继承的属性的可见性(如果它public在基类中,则不能更改为protectedprivate在子类中;只允许相反的方式)。

Foo.logBar()例如,可以使用类型参数调用静态方法string,因为对泛型参数没有任何限制T

Foo不能Bar在表达式中替换为,Foo.logBar('abc')因为'abc'它是一个字符串并且Bar.logBar()需要一个类型的参数number(由于在 class<T extends number>中的方法定义中)。logBar()Bar

用简单的英语,这就是您引用的错误消息试图告诉您的内容。
T在基类上可以是任何东西,但不是它在基类中接受的所有值都在子类中被接受;子类只number接受T.


推荐阅读