首页 > 解决方案 > Typescript:如何推断实现接口的类类型

问题描述

给个接口

interface IAnInterface {

}

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

意义!上课:

class AClassThatImplmentsAnInterface implements IAnInterface {

}

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

typeof AClassThatImplementsAnInterface

但在接口层面!指向所有实现接口的类!

所以如果我这样做:

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

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

在打字稿中甚至可能!?

否则,如果它只是类!我们可以用typeof MyClass

也适用于上述类型!如果我们为实现类的类创建映射对象!我们总是可以这样做:

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

// then:

export type MyMappingType = typeof myMapping;

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

标签: typescriptclasstypesinterfacereference

解决方案


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

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, "");

游乐场链接


推荐阅读