Хобрук: Ваш путь к мастерству в программировании

Typescript: класс, который реализует как минимум определенный интерфейс.

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

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

теперь я хочу написать метод, который позже примет, например. птица (класс, реализующий Animal). На момент написания метода определение птицы еще не существовало. Также может быть предоставлен экземпляр Shark. Но минимальное требование будет состоять в том, что любой объект, который он получит, будет экземпляром класса, реализующего 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.


  • Ваш пример, похоже, не требует типа T 15.11.2018

Ответы:


1

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

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);
15.11.2018
  • Спасибо. Это то, что я искал. Я заметил еще одну ошибку в своем коде. Предполагается, что класс Bird‹T› реализует Animal‹Bird›, или я ошибаюсь? 15.11.2018
  • И последний вопрос. Что, например. что у меня есть еще один параметр в Bird, называемый BiggestEnemy, который будет экземпляром класса, реализующего Animal. Как ты мог такое написать? 15.11.2018
  • Это Animal<Bird>, если дети должны быть ограничены Bird. Я думаю, если мы говорим о реальной жизни, это правда! В этом случае Bird не обязательно должно быть общим, это будет просто class Bird implements Animal<Bird>, а дочерние элементы будут Array<Bird>. 15.11.2018
  • BiggestEnemy сложно, если только вы не знаете, что кошки едят птиц, так что это будет biggestEnemy: Animal<Cat>, например, мы не знаем, какая кошка, но это определенно кошка. 15.11.2018
  • Хорошо, это именно тот момент, когда я терплю неудачу :D 15.11.2018
  • @relief.melone, необычная версия может работать лучше, если вы не знаете, что это определенно кошка. 15.11.2018
  • Определенно похоже. Похоже, вы попадаете в бесконечный цикл, если пытаетесь решить эту проблему с помощью дженериков. 15.11.2018
  • Новые материалы

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

    Управление состоянием в микрофронтендах
    Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..