实现Iterator <t>的Typescript接口

时间:2016-10-10 19:47:44

标签: typescript ecmascript-6 typescript1.8

我试图了解这是否可能......

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();
}

2 个答案:

答案 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循环中遇到错误(比如在游乐场):

  

键入'this'不是数组类型或字符串类型

您可以在此处找到有关此内容的更多信息:
Iterators and generators
在这里:
Iteration protocols

答案 1 :(得分:0)

我认为您正在为interfaces寻找extends

摘录:

扩展接口

  

与类类似,接口可以相互扩展。这允许您将一个接口的成员复制到另一个接口,这使您可以更灵活地将接口分成可重用的组件。

interface Shape {
  color: string;
} 

interface Square extends Shape {
  sideLength: number;
}   

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