0

对于下面的代码

class MakeIterable {

    index: number;
    data: number[];

    constructor(data: number[]) {
      this.index = 0;
      this.data = data;
    }

    [Symbol.iterator]() {
      return {
        next: () => {
          if (this.index < this.data.length) {
            return {
                value: this.data[this.index++], 
                done: false
            };
          } else {
            this.index = 0; //If we would like to iterate over this again without forcing manual update of the index
            return {done: true};
          }
        }
      }
    };
}

const itrble: MakeIterable = new MakeIterable([1,2,3,4,5]);

for (const val of itrble) {
    console.log(val);  // expecting '1' '2' '3' '4' '5' 
}

使用给定的配置,

{

"compilerOptions": {

  "lib": ["es2015", "dom"]
},
"files": [
  "tstut.ts"
]

}


如何解决以下错误?

$ tsc --target ES5
tstut.ts(30,19): error TS2495: Type 'MakeIterable' is not an array type or a string type

$ tsc --target ES6
tstut.ts(30,19): error TS2322: Type 'MakeIterable' is not assignable to type 'Iterable<number>'.
  Types of property '[Symbol.iterator]' are incompatible.
    Type '() => { next: () => { value: number; done: boolean; } | { done: boolean; value?: undefined; }; }' is not assignable to type '() => Iterator<number>'.
      Type '{ next: () => { value: number; done: boolean; } | { done: boolean; value?: undefined; }; }' is not assignable to type 'Iterator<number>'.
        Types of property 'next' are incompatible.
          Type '() => { value: number; done: boolean; } | { done: boolean; value?: undefined; }' is not assignable to type '(value?: any) => IteratorResult<number>'.
            Type '{ value: number; done: boolean; } | { done: boolean; value?: undefined; }' is not assignable to type 'IteratorResult<number>'.
              Type '{ done: boolean; value?: undefined; }' is not assignable to type 'IteratorResult<number>'.
                Property 'value' is optional in type '{ done: boolean; value?: undefined; }' but required in type 'IteratorResult<number>'.
4

1 回答 1

1

TS2495:类型“MakeIterable”不是数组类型或字符串类型

使用了该非数组迭代器的结果。

for..of和其他迭代方法出于历史原因将可迭代对象视为数组,这导致不合规但更简洁的输出。

downlevelIteration应启用选项以正确处理非数组迭代。

这对于 ES6 目标不是必需的。没有downlevelIteration.

TS2322:类型“MakeIterable”不可分配给类型“Iterable”。

next并不总是返回一个值,虽然它应该。它可能应该是:

      ...
      } else {
        return {value: undefined, done: true};
      }
      ...
于 2018-05-13T13:01:03.050 回答