用静态方法将实现的类存储在字典中:打字稿

问题描述 投票:0回答:1

我有一个抽象类,它的子类继承了它。它还有一个静态函数,每个类包含一些硬编码数据。

我也有一个将字符串绑定到类B和C的类映射。当我尝试为该映射指定类型def时,将得到错误类型。

如果使用new () => A,则不能使用静态方法。

如果使用typeof A,则无法使用它创建新的类实例。

abstact class A {
  static getSomeData(): string { return ''; }
  abstract doSomething(): void { }
}

class B extends A {
  getSomeData(): string { return 'hello' }
  doSomething(): {}
}

class C extends A {
  getSomeData(): string { return 'bye' }
  doSomething(): {}
}

const classMap: { [id: string]: SOMETHING_HERE } = {
  first: B,
  second: C
}

///////
// Later
// I want to be able to both of these without TS complaining about types

classMap['first'].getSomeData();
new classMap['first']()

我需要做什么来指定类型?

typescript class static
1个回答
1
投票

简单的答案是typeof A & (new () => A)

但是我建议重新考虑您使用的模式:

  • 构造函数不是设计用于多态的,因为它们不是实例方法,它们更可能是一种特殊的静态方法。例如,当基类定义一个公共方法时,其所有后代也必须公开该方法。这不适用于构造函数-后代完全不必公开公共构造函数。
  • 出于相同的原因,不应将静态方法与多态性一起使用。

尽管您可以在ES6 / Typescript中都可以做到,但我不建议这样做,因为任何阅读此代码的人都很难理解这种结构化类型与类多态性的奇异组合。这也是为什么键入此类内容非常棘手的原因(尽管仍然可行)。

为什么不使用具有甚至更简单类型的简单对象呢?

interface A {
  getSomeData(): string;
  createInstance(): {
    doSomething(): void;
  };
}
const B: A = {
  getSomeData() {
    return 'hello';
  }
  createInstance() {
    return {
      doSomething() {}
    };
  }
}
const C: A = {
  getSomeData() {
    return 'bye';
  }
  createInstance() {
    return {
      doSomething() {}
    };
  }
}

const classMap: { [id: string]: A } = {
  first: B,
  second: C
};

classMap['first'].getSomeData();
classMap['first'].createInstance();
© www.soinside.com 2019 - 2024. All rights reserved.