Как написать функцию TypeScript, принимающую класс, реализующий интерфейс в качестве параметра? - PullRequest
0 голосов
/ 28 сентября 2018

Я хочу написать функцию, которая принимает класс в качестве аргумента, но только классы, которые implement имеют определенный интерфейс.

Я знаю, что могу использовать any, но было бы неплоходля обеспечения этого используйте систему типов.

Какой-то псевдокод для выражения того, что я имею в виду ...

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

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

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Может быть, вы можете использовать дженерики для достижения того, что вы хотите сделать.Вот обходной путь:

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

Так вот, T - это динамический тип, который обязательно реализует myInterface (да, ключевое слово расширяется, а говорить об интерфейсах здесь странно).

Вы можете проверить документациюниже, часть «Общие ограничения» https://www.typescriptlang.org/docs/handbook/generics.html

0 голосов
/ 28 сентября 2018

Вы можете использовать сигнатуру конструктора, чтобы обеспечить тот факт, что конструктор будет возвращать экземпляр, совместимый с интерфейсом.Вы можете использовать его как ограничение общего параметра или непосредственно как параметр в зависимости от того, что вам нужно сделать с классом:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...