2016-10-10 6 views
0

Я пытаюсь понять, если это возможно ...Машинопись Интерфейсы реализующие итератора <T>

export interface ISomething { ... } 
export interface ISomethingElse implements Iterator<ISomething> { ... doSomeJob(): void; ... } 

Идея заключается в том, что, когда я объявляю свой класс, ClassA я могу сделать что-то вроде этого ...

export ClassA implements ISomethingElse { 

public doSomeJob(): void { 
    for (let item of this) { 
     console.log(item); 
    } 
} 

} 

Я ищу осуществить то, что ведет себя как этой декларации в C#

public interface ISomethingElse : IEnumerable<ISomething> { 
    void DoSomeJob(); 
} 
+0

Не должен быть 'интерфейс экспорта ISomethingElse расширяет Iterator ' вместо 'интерфейса экспорта ISomethingElse реализует Iterator '? AFAIK, вот путь для наследования интерфейсов –

+0

Я бы подумал, что вы хотите реализовать «Итеративный», а не «Итератор» ... –

ответ

1

Если вы хотите использовать Iterator, то вы можете сделать это:

interface ISomething { } 

interface ISomethingElse extends Iterator<ISomething> { 
    doSomeJob(): void; 
} 

class ClassA implements ISomethingElse { 
    private counter: number = 0; 

    public next(): IteratorResult<ISomething>{ 
     if (++this.counter < 10) { 
      return { 
       done: false, 
       value: this.counter 
      } 
     } else { 
      return { 
       done: true, 
       value: this.counter 
      } 
     } 

    } 

    public doSomeJob(): void { 
     let current = this.next(); 
     while (!current.done) { 
      console.log(current.value); 
      current = this.next(); 
     } 
    } 
} 

(code in playground)

Но если вы хотите использовать цикл for/of, то вам нужно использование Iterable:

interface ISomethingElse extends Iterable<ISomething> { 
    doSomeJob(): void; 
} 

class ClassA implements ISomethingElse { 
    [Symbol.iterator]() { 
     let counter = 0; 

     return { 
      next(): IteratorResult<ISomething> { 
       if (++this.counter < 10) { 
        return { 
         done: false, 
         value: counter 
        } 
       } else { 
        return { 
         done: true, 
         value: counter 
        } 
       } 
      } 
     } 
    } 

    public doSomeJob(): void { 
     for (let item of this) { 
      console.log(item); 
     } 
    } 
} 

(code in playground)

Но вы должны предназначаться es6, в противном случае вы получите сообщение об ошибке в цикле for/of (как в детской площадке):

Тип «это» не является типом массива или строкового типа

Вы можете найти более подробную информацию об этом здесь:
Iterators and generators
и здесь:
Iteration protocols

+0

отлично, спасибо. Мне не нужен цикл for конкретно, но поскольку я уже нацелился на es6, у меня нет проблемы с использованием Iterable . – Daz

0

Я думаю, вы ищете extends для interfaces.

Выдержки:

Продление Интерфейсы

Как и классы, интерфейсы могут расширять друг друга. Это позволяет вам копировать элементы одного интерфейса в другой, что дает вам больше гибкости в том, как вы разделяете свои интерфейсы на компоненты многократного использования.

interface Shape { 
    color: string; 
} 

interface Square extends Shape { 
    sideLength: number; 
} 

let square = <Square>{}; 
square.color = "blue"; 
square.sideLength = 10;