Typescript: класс, который реализует по крайней мере определенный интерфейс - PullRequest
0 голосов
/ 15 ноября 2018

У меня следующий вопрос. Допустим, у меня есть такой интерфейс

interface Animal<T>{
   children: Array<T>
}

Теперь я хочу написать метод, который позже примет, например, птица (класс, который реализует Animal). На момент написания метода определения для птицы еще не было. Также может быть, что будет дан экземпляр Акулы. Но минимальным требованием будет то, что любой объект, который он получит, будет экземпляром класса, который реализует Animal.

function doSomething(AnAnimal){
   //Do something with animal
}

// Implementation with a class that implements Animal

class Bird<T> implements Animal{
   children: Array<T>;
   color: string;
   chirp(){console.log('peep')}

   constructor(Color:string){
      this.color = Color;
   }
}

let tweety = new Bird('yellow');

doSomething(Tweety)

Я надеюсь, что смогу прояснить, что я пытаюсь сделать, и у вас есть идея, как я могу решить эту проблему в TypeScript.

1 Ответ

0 голосов
/ 15 ноября 2018

Вам необходимо передавать аргументы типа по всему вашему примеру ...

interface Animal<T>{
   children: Array<T>
}

function doSomething<T>(arg: Animal<T>){
   //Do something with animal
}

class Bird<T> implements Animal<T>{
   children: Array<T>;
   color: string;
   chirp(){console.log('peep')}

   constructor(Color:string){
      this.color = Color;
   }
}

let tweety = new Bird('yellow');

doSomething(tweety);

Например, Bird<T> должен реализовывать Animal<T>.Функция doSomething должна быть универсальной, чтобы иметь дело с аргументом типа Animal<T>.

Неуниверсальная версия

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

interface Animal {
    children: Array<Animal>;
}

function doSomething(arg: Animal) {
    //Do something with animal
}

class Bird implements Animal {
    children: Array<Bird>;
    biggestEnemy: Animal;
    color: string;
    chirp() { console.log('peep') }

    constructor(Color: string) {
        this.color = Color;
    }
}

let tweety = new Bird('yellow');

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