从子类集合中实例化类,同时保持对 Typescript 中静态成员的访问

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

假设你有

abstract class A { ... }
class B extends A { ... }
class C extends A { ... }

等等。等等

当将这些类用作集合的元素时,您希望有一个属性来区分它们,但也希望能够实例化它们。 一个例子可能是

function foo(subclassIdentifier: string, subclassesOfA: (typeof A)[]): void {
    let subclass = subclassesOfA.find((subclass: (typeof A)) => return subclass.identifier == subclassIdentifier);
    //Error: Cannot create an instance of an abstract class. ts(2511)
    let instance = new subclass();
}

您遇到错误(无法创建抽象类的实例。ts(2511))。

我想我可能遇到了一种情况,我想要的最好的描述方式是在抽象类的成员上同时拥有

static
abstract
,但这在打字稿中似乎不可能。

我尝试了多种不同的集合类型方法。我能得到的最接近的工作是从静态成员类型到类实例的映射,但是您必须单独将值映射到它们的类。

我尝试的另一件事是使用

Newable<T>
类型来描述其构造函数,但这消除了引用子类静态属性的能力(就像其他任何使构造函数可用的东西一样)。

有没有办法在从类集合中检索子类的静态属性及其构造函数时同时引用它?

typescript types abstract-class abstract typescript-types
1个回答
0
投票
abstract class A {
  static identifier: string;

  abstract someMethod(): void;
}

class B extends A {
  static identifier = 'B';

  someMethod(): void {
    console.log('Method in B');
  }
}

class C extends A {
  static identifier = 'C';

  someMethod(): void {
    console.log('Method in C');
  }
}

function foo(subclassIdentifier: string, subclassesOfA: (typeof A)[]): void {
  let subclass = subclassesOfA.find(subclass => subclass.identifier === subclassIdentifier);

  if (subclass) {
    let instance = new subclass();
    instance.someMethod();
  } else {
    console.error('Subclass not found');
  }
}

// Example usage
foo('B', [B, C]); // Output: Method in B
foo('C', [B, C]); // Output: Method in C

© www.soinside.com 2019 - 2024. All rights reserved.