spread sözdizimi - TypeScript 2.8.3 Tür, bir iterator döndüren bir Symbol.iterator metoduna sahip olmalıdır
Bir hata ile karşılaşıyorum ve diyor ki
Type must have a '[Symbol.iterator]()' method that returns an iterator.
Sınırlanmış çizgi üzerinde umut eder:
class Test {
private async do() {
const done = [...(await this.test())]; // Here's the error
}
private async *test(): AsyncIterableIterator<string> {
return;
}
}
TypeScript GitHub deposunda birkaç sorun buldum, ancak hiçbiri işe yaramış gibi görünmüyor. Hepsi lib'e yeni girdiler eklemeyi öneriyor. es6 hedefini kullanıyorum ve esnext, dom ve es2018 ekledim. Bu, hata üzerinde hiçbir etki yapmadı.
Daha fazla lib girdisini mi kaçırıyorum (kullandığım şeylerin hepsi içinde her şey olan genel olanlar olduğu için bundan şüpheliyim) yoksa kullandığım kod mu geçersiz?
Cevap #1
bu bana yardımcı oldu. tsconfig'de bunu ekleyin:
{
"compilerOptions": {
"lib": [
"es5", "es6", "dom", "dom.iterable"
]
}
}
Bu, tsconfig'in kodunuzu derlerken hangi arayüzleri içe aktaracağını bilmesi için gereklidir.
dom.iterable burada belirtilen tüm arayüzleri içerir: https://github.com/microsoft/TypeScript/blob/main/src/lib/dom.iterable.d.ts
Bunu belirttiği için @domlas'a da teşekkürler. Ben zaten yorumunu oy verdim, böylece varsayılan neden olarak kabul edilsin.
Cevap #2
Bence hatayı, "this.test()" öğesini string veya diziye cast ederseniz ortadan kaldırabilirsiniz.
Benim durumum farklıydı, ama çözümlerimin bazı meslektaş geliştiricilere yardımcı olabileceğini düşünüyorum.
Aldığım hata mesajı şuydu:
Type 'Ingredient | Ingredient[]' must have a '[Symbol.iterator]()'
method that returns an iterator
Birkaç yol denedim ve aşağıdaki ÜÇ tanesi işe yaradı, en basiti İLK olan:
Cevap #3
“Type Object must have a Symbol.iterator method that returns an iterator” hatası, bir nesneyi bir dizide açmak için spread sözdizimini (...) kullanmaya çalıştığımızda ortaya çıkar. Hatanın çözümü için nesnenizi bir dizi içine alın veya tip tanımlarınızı düzeltin.
böyle..
const obj = { name: 'James' };
// ⛔️ Error: Type Object must have a '[Symbol.iterator]()'
// method that returns an iterator.ts(2488)
const result = [...obj];
Bir nesnenin özelliklerini doğrudan bir diziye açmak için spread sözdizimini kullanmayı denedik.
Bu çözüm, kullanım durumunuza bağlıdır. Nesneyi bir diziye açmak istiyorsanız, yayma sözdizimini (...) kullanmadan önce onu bir diziye sarın.
const obj = { name: 'James' };
const result = [...[obj]];
console.log(result); // 👉️ [{name: 'James'}]
kaynak burada
Cevap #4
Yukarıda belirttiğim gibi, yayma operatörü ne yazık ki şu anda asenkron iteratörler için desteklenmemektedir. GitHub'daki ilgili sorun tc39/proposal-async-iteration#103'tür.
O konudan özet (gereksiz şeyler hariç, örneğin "bunu böyle yapabilirsin, hayır yapamazsın, boşver"):
@jedwards1211 dedi ki:
Dizi yayılma operatörü desteği bu önerinin bir parçası olacak mı?
@domenic cevapladı:
Bu teklifin bir parçası değil... Başka bir teklif kesinlikle burada yeni bir şeyi düşünebilir.
Ve başka bir yerde bir öneri görmüyorum (başlatmak ister misin?). Her neyse, JavaScript ESNext'in bir parçası bile olmadığı için, büyük olasılıkla TypeScript'e eklenmeyecek.
En uygulanabilir alternatif, @estus'un cevabında detaylandırılan for await söz dizimidir. Daha fazla yardımcı olamadığım için üzgünüm. İyi şanslar!
Cevap #5
Sözdizimi neyi öneriyor olursa olsun, asenkron üretici fonksiyon, bir üretici döndüren async fonksiyon değildir.
Öneride belirtildiği gibi,
Asenkron üreteç fonksiyonları, aşağıdaki farklarla birlikte, üreteç fonksiyonlara benzerdir:
Çağrıldığında, async üreteç fonksiyonları bir nesne döndürür, yöntemleri (next, throw ve return) doğrudan { value, done } döndürmek yerine { value, done } için promiseler döndüren bir async üreteç. Bu, döndürülen async üreteç nesnelerini otomatik olarak async iteratorler yapar.
Bu bir söz (promise) değil, asenkron bir üretici döndürür, bu yüzden await ile beklemek herhangi bir fayda sağlamaz.
Asenkron jeneratör, Symbol.iterator yerine Symbol.asyncIterator içerdiğinden, yinelemeli olmayan bir iterator'dır, yani normal ES6 yöntemleriyle (Array.from, for..of, yayma sözdizimi vb.) yinelemez. Bu yüzden for await..of tanıtılmıştır.
Yukarıdaki kod şöyle olmalıdır:
const values = [];
for await (const value of this.test()) {
values.push(v);
}
Asenkron iterator üzerinde yineleme, normal iteratorlarda olduğu gibi basitleştirilebilir; fark, next()'in kendisi bir değer değil, bir sonraki değerin sözünü (promise) döndürmesidir:
const iterator = this.test();
let next;
while ((next = await iterator.next()).done === false) {
values.push(next.value);
}
Asenkron üretici spesifikasyonu bir öneri olduğundan, ES6 yineleme yöntemlerindeki async iterator desteği değişikliğe tabi olabilir.



