Вы можете использовать сигнатуру конструктора, чтобы обеспечить тот факт, что конструктор будет возвращать экземпляр, совместимый с интерфейсом.Вы можете использовать его как ограничение общего параметра или непосредственно как параметр в зависимости от того, что вам нужно сделать с классом:
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