Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
142 views
in Technique[技术] by (71.8m points)

ts中如何写子类的静态方法

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)
  }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

当前最新版本的 TS 编译器不支持。

要变通的话,extends “扩展” 是不行了,只能 implements “实现”。

class Sub implements Base {
    public foo: string;
    public bar: number;

    constructor(arg: number) {
        this.foo = arg + '';
        this.bar = arg;
    }

    static create(arg: number) {
        return new Sub(arg);
    }
}

不过这么写就恶心了,父类里的成员还得重写一遍;要么你就 @ts-ignore 掉;或者 any 大法

P.S. 静态方法覆写报错的问题从 2015 年就有人提出了(GitHub 讨论传送门:https://github.com/microsoft/...),之所以不支持,是出于兼容很多 Polyfill 库的考虑。社区的主流意见是希望增加一个编译器参数可以控制是否允许覆写静态方法,不过到目前为止这个功能都还是没有的 ……


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...