class Base {
public foo:string
constructor(arg:string){
this.foo = arg
}
static create(arg:string){
return new Base(arg)
}
}
class Sub extends Base {
public bar:number
constructor(arg:number){
super("1")
this.bar = arg
}
// 解决方案1
// 重写 create
// 报错:不能将类型“string”分配给类型“number”。 因为父类的create 的arg参数是string类型 而子类的 create 的arg参数是number类型
// static create(arg:number){
// return new Sub(arg)
// }
// 解决方案2
// 写一个新的方法
// 问题: Sub.create() 依然是会编译器被提示 且可以调用 但是事实上不应该通过Sub调用create的方法
static createBar(arg:number){
return new Sub(arg)
}
}
当前最新版本的 TS 编译器不支持。
要变通的话,
extends
“扩展” 是不行了,只能implements
“实现”。不过这么写就恶心了,父类里的成员还得重写一遍;要么你就
@ts-ignore
掉;或者 any 大法。P.S. 静态方法覆写报错的问题从 2015 年就有人提出了(GitHub 讨论传送门:https://github.com/microsoft/...),之所以不支持,是出于兼容很多 Polyfill 库的考虑。社区的主流意见是希望增加一个编译器参数可以控制是否允许覆写静态方法,不过到目前为止这个功能都还是没有的 ……