Akan lebih baik jika sintax baru for (let value of values)
bekerja dengan iterator; yaitu:
for (let value of myMap.values()) {
doSomething(value);
}
Terkait dengan # 2695.
Ini sudah diizinkan jika target Anda adalah ES6:
interface MyMap<T> {
values(): Iterable<T>;
}
var myMap: MyMap<string>;
for (let value of myMap.values()) {
var s: string = value;
}
Alasan mengapa ini tidak diizinkan di ES5 / ES3 adalah:
Sebagai hasil dari faktor-faktor ini, dalam ES3 / ES5 hanya array yang diperbolehkan dalam for..of loop (sebagai objek iterable paling umum yang tersedia dalam bahasa JS saat ini); seperti untuk menargetkan ES6 (yaitu dengan dukungan mesin runtime untuk iterable dan array yang dapat diulang) iterable khusus diperbolehkan selain Array, string, map dan set, .. dll ..
Dimengerti ...
@mhegazy Terima kasih banyak atas tanggapan rinci Anda !!!
Saya merasa ini sangat mengecewakan. Saya dapat menggunakan for-of dengan ES5 iterable dan target dengan Traceur dan Babel hari ini. Saya tertarik untuk mengusulkan agar tim kami beralih dari Traceur ke TypeScript, tetapi batasan dalam TypeScript ini akan menghentikannya. Ketika TypeScript mengatakan itu bertujuan untuk menjadi superset dari ES6, saya pikir itu perlu menyertakan kemampuan untuk menargetkan browser ES5 untuk semua fitur ES6 yang didukungnya.
Saya kira saya bisa menggunakan TypeScript untuk menargetkan ES6 dan kemudian menjalankan output itu melalui Traceur atau Babel. Saya benar-benar tidak ingin melakukan itu.
Sebagai pembaruan untuk masalah ini, protokol iterator sekarang didukung untuk target ES3 / ES5 menggunakan --downlevelIteration
. Lihat # 12346 untuk info lebih lanjut.
Sepertinya ini seharusnya diperbaiki untuk TS 2.3, tapi saya menjalankan TS 2.3.3 dan
for (let [ i, observationPoint ] of observationPointsList.entries())
observationPoints[ observationPoint.spot || (i + 1) ] = observationPoint;
di mana observationPointsList
adalah ObservationPointModel[]
, menghasilkan:
[11:30:56] typescript: src/models/observation-set.ts, line: 44
Type 'IterableIterator<[number, ObservationPointModel]>' is not an array type or a string type.
Apakah saya melewatkan sesuatu?
Ah, memang. Saya tidak bisa melihat dalam dokumentasi ini atau # 12346 - mengapa ini tersembunyi di balik opsi yang bertentangan dengan perilaku standar? Akankah ini selalu tetap opsional?
@lhunath itu ada dalam informasi rilis resmi untuk 2.3 . Ini opsional karena memiliki dampak yang sangat signifikan pada ukuran kode yang dihasilkan, dan berpotensi pada kinerja, untuk semua penggunaan iterable (termasuk array). Saya menemukan pengorbanannya sepadan dengan peningkatan ekspresi, tetapi membuat kode yang ada lebih lambat dan lebih kompleks tampaknya seperti pembenaran yang masuk akal karena ada sebuah bendera.
Komentar yang paling membantu
Saya merasa ini sangat mengecewakan. Saya dapat menggunakan for-of dengan ES5 iterable dan target dengan Traceur dan Babel hari ini. Saya tertarik untuk mengusulkan agar tim kami beralih dari Traceur ke TypeScript, tetapi batasan dalam TypeScript ini akan menghentikannya. Ketika TypeScript mengatakan itu bertujuan untuk menjadi superset dari ES6, saya pikir itu perlu menyertakan kemampuan untuk menargetkan browser ES5 untuk semua fitur ES6 yang didukungnya.