社区活动
官方社群
交流群:250325468
公众号:粟米前端
哔哩哔哩:粟米前端
问一个泛型的问题
sumicode_1127LV1 8月3日 14:56 阅读 23 回答 1 回复 1 点赞 0
23 1 1 0

就是想用单例+泛型去实现一个单例的父类,现在子类调用还是需要传入子类的类型,想把这个干掉,AA.getInstance<AA>().a这个后面的AA感觉可以去掉,毕竟在调用的时候就知道了,不知道怎么实现。

class BaseClass {
  public constructor(...param: any[]) { }
  public static _instance: any;
  static getInstance<T extends BaseClass>(...param: any[]): T {
    var Class = this;
    if (Class._instance) {
      Class._instance = new Class(...param);
    }
    return Class._instance;
  }
}
class AA extends BaseClass {
  public a = 10;
}

class BB extends BaseClass {
  public b = 10;
}

AA.getInstance<AA>().a
BB.getInstance<BB>().b
扫码分享到移动端
1个回答,1 条回复:
轩辕少康LV3 回答于 8月4日 01:20
2人赞同了该回答

可以通过 this 来约束,如下:

class BaseClass {
  public constructor(...param: any[]) {}
  public static _instance: any
  static getInstance<T extends BaseClass, P extends any[]>(
    this: { new (...param: P): T; _instance: any },
    ...param: P
  ): T {
    var Class = this
    if (Class._instance) {
      Class._instance = new Class(...param)
    }
    return Class._instance
  }
}
class AA extends BaseClass {
  public a = 10
}

class BB extends BaseClass {
  public b = 10
}

AA.getInstance().a
BB.getInstance().b

const t = AA.getInstance

TS Playground

使用{ new (...param: P): T;}可以定义一个 T 的类类型,当调用AA.getInstance时,此时thisAA的类类型,由此可以推断出 T 的类型为AA,这样由 TS 推断出来getInstance的返回类型为AA而不用手动去指定

参与回答互动
登录即可参与回答和互动哦