Saltar al contenido

TypeScript 2.8.3 El tipo debe tener un método Symbol.iterator que devuelva un iterador

Después de consultar con expertos en la materia, programadores de varias ramas y profesores hemos dado con la respuesta al dilema y la dejamos plasmada en esta publicación.

Solución:

esto me ha ayudado. en tsconfig, agregue esto:


    "compilerOptions": 
        "lib": [
            "es5", "es6", "dom", "dom.iterable"
        ]
    

Esto es necesario para que tsconfig sepa qué interfaces importar mientras transpila su código.

dom.iterable incluye todas las interfaces mencionadas aquí: https://github.com/microsoft/TypeScript/blob/master/lib/lib.dom.iterable.d.ts

También gracias a @domlas por mencionar esto. Ya voté su comentario para que se trate como motivo predeterminado.

Como comenté anteriormente, lamentablemente, el operador de propagación actualmente no es compatible con los iteradores asíncronos. El problema relevante en GitHub es tc39/proposal-async-iteration#103.

Resumen de ese problema (menos cosas extrañas como “podrías hacerlo de esta manera, no, no puedes, no importa”):

@jedwards1211 dijo:

Será array difundir el apoyo del operador alguna vez ser parte de esta propuesta?

@domenic respondió:

No forma parte de esta propuesta… Otra propuesta ciertamente podría contemplar algo nuevo aquí.

Y no veo una propuesta en otro lado (¿quieres empezar una?). En cualquier caso, dado que no forma parte ni siquiera de JavaScript ESNext, lo más probable es que no se agregue a TypeScript.

La alternativa más viable es la for await sintaxis detallada en la respuesta de @estus. Lo siento, no podría ser más útil. ¡Buena suerte!

A pesar de lo que pueda sugerir la sintaxis, la función de generador asíncrono no es async función que devuelve un generador.

Como dice la propuesta,

Las funciones del generador asíncrono son similares a las funciones del generador, con las siguientes diferencias:

Cuando se las llama, las funciones del generador asíncrono devuelven un objeto, un generador asíncrono cuyos métodos (siguiente, lanzar y devolver) devuelven promesas de valor, hecho , en lugar de devolver directamente valor, hecho . Esto convierte automáticamente los objetos generadores asíncronos devueltos en iteradores asíncronos.

Devuelve un generador asíncrono, no una promesa, por lo que awaiting no hace ningún bien.

Dado que el generador asíncrono tiene Symbol.asyncIterator en vez de Symbol.iteratores un iterador no iterable, es decir, no se puede iterar con los métodos normales de ES6 (Array.from, for..of, difundir sintaxis, etc.). Esta es la razón porque for await..of Fue presentado.

El código anterior debería ser:

const values = [];

for await (const value of this.test()) 
  values.push(v);

La iteración sobre el iterador asíncrono se puede eliminar de manera similar a los iteradores regulares, la diferencia es que next() devuelve una promesa del siguiente valor, no un valor en sí mismo:

const iterator = this.test();
let next;
       
while ((next = await iterator.next()).done === false) 
  values.push(next.value);

Dado que la especificación del generador asíncrono es una propuesta, la compatibilidad con los iteradores asíncronos en los métodos de iteración de ES6 puede estar sujeta a cambios.

Acuérdate de que tienes autorización de añadir un diagnóstico certero si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *