我想编写一个函数,该函数接受类作为参数,但仅接受implement
特定接口的类。
我知道我可以使用any
,但是最好依靠类型系统来强制执行此操作。
一些伪代码表达我的意思...
interface MyInterface { ... }
class Class1 implements MyInterface { ... }
class Class2 { ... }
function doStuff(classParameter: Class implements MyInterface) { ... }
doStuff(Class1); // OK
doStuff(Class2); // Error
答案 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