typescript 如何推断实现接口的类类型

hfyxw5xn  于 2023-05-01  发布在  TypeScript
关注(0)|答案(2)|浏览(198)

给定一个接口:

interface IAnInterface {

}

如何引用和指向实现该接口的类类型?
给定类的含义:

class AClassThatImplmentsAnInterface implements IAnInterface {

}

如何引用作为类类型的类型?如果只是类,我们可以使用typeof

typeof AClassThatImplementsAnInterface

但是在接口级别,它指向实现接口的所有类:

typeof IAnInterface

给出错误:

'IAnInterface' only refers to a type, but is being used as a value here. (2693)

我想做的是:

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

Class不存在于TypeScript中。如何引用Class<IAnInterface>的等价物?在TypeScript中是否可能?

wsxa1bj1

wsxa1bj11#

我假设您试图Map到类本身,而不是类的示例。所以基本上是可以构造的。我认为这种类型应该适合你:

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

我们声明Class<IAnInterface>可以用new关键字和一些参数调用,并将返回IAnInterface对象(类示例)。
第二个参数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

68bkxrlz

68bkxrlz2#

(仅限Angular)

Angular在类中有一个构建:Type
您可以在relevant question中阅读更多内容。

相关问题