TS2322 & TS2495 - Итераторы с целями ES6 и ES5 - PullRequest
0 голосов
/ 13 мая 2018

Для приведенного ниже кода

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>'.

1 Ответ

0 голосов
/ 13 мая 2018

TS2495: Тип 'MakeIterable' не является типом массива или типом строки

результаты этого итератора, не являющегося массивом, использовались.

for..of идругие итерационные методы рассматривают итерации как массивы по историческим причинам, что приводит к несовместимым, но более кратким выводам.

downlevelIteration опция должна быть включена для правильной обработки итерируемых элементов без массивов.

Это не обязательно для цели ES6. Он должен работать как положено без downlevelIteration.

TS2322: типу 'MakeIterable' нельзя присвоить типу'Iterable'.

next не всегда возвращает значение, в то время как это должно быть.Вероятно, должно быть:

      ...
      } else {
        return {value: undefined, done: true};
      }
      ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...