打字稿:如何推断实现接口的 class 类型

Typescript: how to inference class type that implements an interface

提供接口

interface IAnInterface {

}

如何引用和指向实现该接口的 class 类型!

意义!给出一个 class:

class AClassThatImplmentsAnInterface implements IAnInterface {

}

如何引用属于class类型的类型!这相当于:

typeof AClassThatImplementsAnInterface

但是在界面层面!指向实现该接口的所有 classes!

所以如果我这样做:

type IClassTypeMapping = {
 [names in SomeLiteralStringUnion]: Class<IAnInterface>
}

当然 Class 不存在于打字稿中!但我想我很好地解释了我在问什么!如何引用 Class<IAnInterface>!?

的等价物

在 Typescript 中甚至可能吗?

否则如果它只是 classes!我们可以使用 typeof MyClass!

也适用于上述类型!如果我们正在为 classes 创建一个实现 class!我们总是可以这样做:

export const myMapping = {
    Name1: Class1,
    Name2: Class2,
    // ...
};

// then:

export type MyMappingType = typeof myMapping;

并且为了避免歧义!因为我话多!问题是:如何引用 Class<IAnInterface> 的等价物?打字稿有可能吗?

我假设您正在尝试映射到 class 本身,而不是映射到 class 的实例。所以基本上有的东西是可以构造的。我认为这种类型应该适合你:

type Class<I, Args extends any[] = any[]> = new(...args: Args) => I;

我们声明可以使用 new 关键字和一些参数调用 Class<IAnInterface>,并且 return 一个 IAnInterface 对象(class实例)。

第二个参数 Args 允许您定义构造函数参数是什么。如果没有参数,它将是一个空数组。

declare const MyClass: Class<IAnInterface, []>;

const instance: IAnInterface = new MyClass();
declare const OtherClass: Class<IAnInterface, [number, string]>;

const otherInstance: IAnInterface = new OtherClass(0, "");

Playground Link

(仅限 Angular)

Angular 在 class 中有一个构建:Type

您可以在 阅读更多内容。