typescript - 类静态函数覆盖导致错误
问题描述
我有以下代码,它只是返回一个错误。
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
解决方案
每当使用基类的实例时,都应该能够使用子类的实例。这称为Liskov 替换原则,它要求子类的方法接受基类的相同方法接受的所有值作为输入(可能更多),并且不返回与子类的相同方法相同的值。基类不能返回。同样的原则也防止子类限制从基类继承的属性的可见性(如果它public
在基类中,则不能更改为protected
或private
在子类中;只允许相反的方式)。
Foo.logBar()
例如,可以使用类型参数调用静态方法string
,因为对泛型参数没有任何限制T
。
但Foo
不能Bar
在表达式中替换为,Foo.logBar('abc')
因为'abc'
它是一个字符串并且Bar.logBar()
需要一个类型的参数number
(由于在 class<T extends number>
中的方法定义中)。logBar()
Bar
用简单的英语,这就是您引用的错误消息试图告诉您的内容。
T
在基类上可以是任何东西,但不是它在基类中接受的所有值都在子类中被接受;子类只number
接受T
.
推荐阅读
- java - 修改现有的 Java 正则表达式
- python - discord.py - 使用长查询和不带双引号的标志
- java - 无法运行 jar 文件以及来自 Python 的一些参数
- java - 如何将辅助项目导入 Android Studio
- sql - 确定哪个年份月份的值最高和最低
- gradle - mac上的OSGI build.bnd没有读取环境变量
- botium-box - Botium 测试聊天机器人按钮和文本
- flutter - 为什么 Flutter 小部件 Visibility 的维护大小属性对我不起作用?
- python - python中有没有办法使用一列作为索引来更改其他字符串列的元素?
- python - 如何检查列表元素是否与df中的某些标题相同?