2017-08-17 3 views
0

Je veux créer un itérateur pour mon tableau en TypeScript, Comment dois-je corriger mon code pour ne pas avoir d'erreur de transpiration? Par génériques ou alors?TypeScript et itérateurs personnalisés

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

Quelle erreur de compilation obtenez-vous ?! – Bergi

+0

erreur: Tapez '() => {suivant:() => {valeur: nombre | indéfini; done: booléen; } } 'n'est pas assignable au type'() => IterableIterator '. Type '{suivant:() => {valeur: nombre | indéfini; done: booléen; } } 'n'est pas assignable au type' IterableIterator '. La propriété '[Symbol.iterator]' est manquante dans le type '{next:() => {value: number | indéfini; done: booléen; } } '. – Crova

+0

Le dernier semble être que votre itérateur devrait être itérable lui-même - essayez d'ajouter '[Symbol.iterator]() {return this}' comme méthode à côté de 'next'. – Bergi

Répondre

0

comme ceci:

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

Vous pouvez le faire sans la fonction de générateur si vous voulez, j'ai juste besoin de trouver la signature correcte de IterableIterator<T>. Faites-moi savoir si vous avez besoin d'aide pour cela.

+0

Je recommanderais une boucle 'for' si – Bergi

+0

Une boucle for est tout aussi bonne, bien que son itérateur ressemble à un test. –

0

Vous pouvez également envisager une fonction de générateur générique. Un exemple simple peut être comme suit.

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 } 

Espérons que ça aide.