如何编写接受实现接口的类作为参数的 TypeScript 函数?

Sop*_*hie 5 interface class typescript

我想编写一个函数,它接受一个类作为参数,但只接受implement一个特定接口的类。

我知道我可以使用any,但是依靠类型系统来强制执行这一点会很好。

一些伪代码来表达我的意思......

interface MyInterface { ... }
class Class1 implements MyInterface { ... }
class Class2 { ... }

function doStuff(classParameter: Class implements MyInterface) { ... }
doStuff(Class1); // OK
doStuff(Class2); // Error
Run Code Online (Sandbox Code Playgroud)

Tit*_*mir 7

您可以使用构造函数签名来强制构造函数将返回与接口兼容的实例这一事实。您可以将其用作通用参数约束或直接用作参数,具体取决于您需要对类执行的操作:

interface MyInterface { foo: number }
class Class1 implements MyInterface { foo: number }
class Class2 { bar: number }

function doStuff0(classParameter: new (...args: any[]) => MyInterface) { }
doStuff0(Class1); // OK
doStuff0(Class2); // Error

function doStuff1<T  extends new (...args: any[]) => MyInterface>(classParameter: T) {  }
doStuff1(Class1); // OK
doStuff1(Class2); // Error
Run Code Online (Sandbox Code Playgroud)

注意我在示例中添加了成员​​,不要忘记 Typescript 使用结构类型系统,因此兼容性由成员决定而不是由implements MyInterface声明决定,因此任何类如果MyInterface为空则兼容,如果类有foo成员则兼容即使它没有明确声明implements MyInterface

  • 第二个通用示例在函数签名中对我有用,并且我能够在我引用作为函数参数接受的类的地方直接使用 `new(...) =&gt; MyInterface` 作为类型。谢谢! (2认同)