2017-08-17 7 views
0

TypeScriptで配列のイテレータを作成したいのですが、コードを修正して蒸散エラーを発生させないでください。ジェネリックかそれとも?そのようTypeScriptとカスタムイテレータ

let array4 = [10, 20, 30]; 

array4[Symbol.iterator] = function() { 
    let i = 0; 
    return { 
    next: function() { 
     i++; 
     return { 
     value: i < 4 ? array4[i - 1] : undefined, 
     done: i >= 4 ? true : false 
     }; 
    } 
    }; 
}; 

let it4 = array4[Symbol.iterator](); 

console.log(it4.next()); 
console.log(it4.next()); 
console.log(it4.next()); 
console.log(it4.next()); 
+0

どのようなコンパイルエラーが発生していますか? – Bergi

+0

エラー: '()=> {next:()=> {value:number |未定義; done:ブール値。 }; } 'は型'()=> IterableIterator 'に割り当てられません。 タイプ '{next:()=> {value:number |未定義; done:ブール値。 }; } 'は' IterableIterator '型に割り当てられません。 プロパティ '[記号.iterator]'がタイプ '{next:()=> {value:number |未定義; done:ブール値。 }; } '。 – Crova

+0

最後のものはあなたのイテレータがiterableでなければならないと思われます - '[Symbol.iterator](){return this}'を 'next'の次のメソッドとして追加してみてください。 – Bergi

答えて

0

:あなたが好きな場合は、ジェネレータ関数なしでそれを行うことができ

array4[Symbol.iterator] = function*() { 
    let i = 0; 
    while (i < 3) { 
     i++; 
     yield array4[i - 1]; 
    } 
}; 

、私はちょうどIterableIterator<T>の正しい署名を見つける必要があります。もしあなたがそれに助けが必要なら私に教えてください。

+0

私は 'for'ループをお勧めしますが、 – Bergi

+0

forループはちょうどいいですが、彼のイテレータはテストのようです。 –

0

ジェネリックジェネレータ機能も考慮することができます。簡単な例は次のようになります。

function* arrayIterator(arr: any[]) { 
    for (var i = 0; i < arr.length; i++) { 
    yield arr[i]; 
    } 
} 

let array4 = [10, 20, 30]; 
var it4 = arrayIterator(array4); 
console.log(it4.next()); // { value: 1, done: false } 
console.log(it4.next()); // { value: 2, done: false } 
console.log(it4.next()); // { value: 3, done: false } 
console.log(it4.next()); // { value: undefined, done: true } 

希望します。

関連する問題