如何编写一个TypeScript函数来接受将接口实现为参数的类?

时间:2018-09-28 13:00:16

标签: typescript class interface

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

我知道我可以使用any,但是最好依靠类型系统来强制执行此操作。

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

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

function doStuff(classParameter: Class implements MyInterface) { ... }
doStuff(Class1); // OK
doStuff(Class2); // Error

2 个答案:

答案 0 :(得分:3)

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

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

注意:我在示例中添加了成员​​,请不要忘记Typescript使用结构化类型系统,因此兼容性由成员决定,而不是由implements MyInterface声明决定,因此任何类都是兼容的如果MyInterface为空,并且一个类具有一个foo成员,即使该类没有显式声明implements MyInterface

答案 1 :(得分:0)

也许您可以使用泛型来实现您想做的事情。这是一种解决方法:

function doStuff<T extends myInterface>(classParameter: T) {
  ...
}

因此,在这里,T是动态类型,必须实现myInterface(是的,在谈论接口时关键字扩展在这里很奇怪)。

您可以查看以下文档,“通用约束”部分 https://www.typescriptlang.org/docs/handbook/generics.html