spread syntax - TypeScript 2.8.3 Typ musí mať metódu Symbol.iterator, ktorá vracia iterátor
Narazil som na chybu, ktorá hovorí
Type must have a '[Symbol.iterator]()' method that returns an iterator.
Dúfa na vyznačenej čiare:
class Test {
private async do() {
const done = [...(await this.test())]; // Here's the error
}
private async *test(): AsyncIterableIterator<string> {
return;
}
}
Našiel som niekoľko problémov v repozitári TypeScript na GitHube, ale žiadny sa nezdá byť užitočný. Všetky navrhujú pridať nové položky do lib. Používam cieľ es6 a pridal som esnext, dom a es2018. Toto nemalo žiadny účinok na chybu.
Chýba mi viac záznamov lib (čo pochybujem, pretože tie, ktoré používam, sú univerzálne so všetkým v nich) alebo je kód, ktorý používam, neplatný?
Odpoveď č. 1
toto mi pomohlo. v tsconfig pridajte toto :
{
"compilerOptions": {
"lib": [
"es5", "es6", "dom", "dom.iterable"
]
}
}
Toto je potrebné, aby tsconfig vedel, ktoré rozhrania importovať pri transpilácii vášho kódu.
dom.iterable zahŕňa všetky rozhrania uvedené tu: https://github.com/microsoft/TypeScript/blob/main/src/lib/dom.iterable.d.ts
Tiež ďakujem @domlas za to, že na to upozornil. Jeho komentár som už ohodnotil kladne, aby sa zobrazoval ako predvolený dôvod.
Odpoveď č. 2
Myslím si, že sa môžete zbaviť chyby, ak pretypujete "this.test()" na string alebo pole.
Moja situácia bola iná, ale myslím, že moje riešenia by mohli pomôcť niektorým kolegom vývojárom.
Chybové hlásenie, ktoré som dostal, bolo:
Type 'Ingredient | Ingredient[]' must have a '[Symbol.iterator]()'
method that returns an iterator
Vyskúšal som niekoľko spôsobov a nasledujúce TROJICA fungovali, pričom PRVÝ bol najjednoduchší:
Odpoveď č. 3
Chyba "Typ Object musí mať metódu Symbol.iterator, ktorá vracia iterátor" nastane, keď sa pokúšame použiť syntax rozšírenia (...) na rozbalenie objektu v poli. Na vyriešenie chyby obalte svoj objekt do poľa alebo opravte svoje typy.
ako toto..
const obj = { name: 'James' };
// ⛔️ Error: Type Object must have a '[Symbol.iterator]()'
// method that returns an iterator.ts(2488)
const result = [...obj];
Snažili sme sa použiť syntax rozšírenia na rozbalenie vlastností objektu priamo do poľa.
Riešenie tohto závisí od vášho použitia. Ak chcete rozbaliť objekt do poľa, zabaľte ho do poľa pred použitím rozširujúcej syntaxe (...).
const obj = { name: 'James' };
const result = [...[obj]];
console.log(result); // 👉️ [{name: 'James'}]
zdroj tu
Odpoveď č. 4
Ako som už komentoval vyššie, operátor rozbalenia bohužiaľ momentálne nie je podporovaný pre asynchrónne iterátory. Príslušná téma na GitHub je tc39/proposal-async-iteration#103.
Zhrnutie z tejto otázky (bez nadbytočných vecí ako „môžete to urobiť takto, ups nie, nemôžete, zabudnite na to“):
@jedwards1211 povedal:
Bude podpora operátora rozpracovania poľa niekedy súčasťou tejto návrhu?
@domenic odpovedal:
Nie je súčasťou tohto návrhu... Iný návrh by tu určite mohol zvážiť niečo nové.
A nikde inde nevidím žiadny návrh (chceš začať jeden?). Každopádne, keďže to nie je súčasťou ani JavaScriptu ESNext, pravdepodobne to nebude pridané do TypeScriptu.
Najvhodnejšou alternatívou je syntax for await podrobne popísaná v odpovedi @estus. Prepáčte, že som nemohol byť užitočnejší. Veľa šťastia!
Odpoveď č. 5
Napriek tomu, čo môže naznačovať syntax, asynchrónna generátorová funkcia nie je async funkcia, ktorá vracia generátor.
Ako návrh uvádza,
Asynchrónne generátorové funkcie sú podobné generátorovým funkciám, s nasledujúcimi rozdielmi:
Keď sa zavolajú, asynchrónne generátorové funkcie vracajú objekt, asynchrónny generátor, ktorého metódy (next, throw a return) vracajú promisy pre { value, done }, namiesto toho, aby priamo vracali { value, done }. To automaticky robí z vrátených objektov asynchrónnych generátorov asynchrónne iterátory.
Vracia asynchrónny generátor, nie sľub (promise), takže await na ňom nie je účinné.
Keďže asynchrónny generátor má Symbol.asyncIterator namiesto Symbol.iterator, ide o neiterovateľný iterátor, t.j. nemožno ho iterovať bežnými metódami ES6 (Array.from, for..of, syntax rozšírenia atď.). Toto je dôvod, prečo bol zavedený for await..of.
Kód vyššie by mal byť:
const values = [];
for await (const value of this.test()) {
values.push(v);
}
Iterácia cez asynchrónny iterátor môže byť rozvinutá podobne ako bežné iterátory, rozdiel je v tom, že next() vracia sľub ďalšej hodnoty, nie samotnú hodnotu:
const iterator = this.test();
let next;
while ((next = await iterator.next()).done === false) {
values.push(next.value);
}
Keďže špecifikácia asynchrónnych generátorov je návrh, podpora asynchrónnych iterátorov v metódach iterácie ES6 môže byť predmetom zmien.



