Typescript: for..of dengan iterator

Dibuat pada 14 Mei 2015  ·  9Komentar  ·  Sumber: microsoft/TypeScript

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.

Question

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.

Semua 9 komentar

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:

  • Salah satu aksioma TypeScript adalah tidak melakukan emit yang diarahkan tipe. yaitu kode yang dipancarkan tidak bergantung pada apa yang dipikirkan sistem tipe tentang kode Anda, melainkan sebagai transformasi sintaksis dari sumber input Anda.
  • Melakukan emulasi iterator penuh berarti kita harus bergantung pada pollyfill untuk Symbol, sekali lagi kualitas lain yang ingin kita pertahankan
  • Logika iterasi penuh yang dihasilkan bukanlah cheep, Anda perlu memanggil next () dan memeriksa selesai, jika gagal kembali jika tidak menggunakan nilainya. ini adalah pengiriman tambahan, dua pencarian properti, dan alokasi objek pada setiap iterasi loop. Kami telah mencoba untuk menjaga kode yang dipancarkan tetap sederhana dan berhubungan dengan sumber khususnya dalam karakteristik kinerja
  • Akhirnya untuk melakukan semua itu pada objek iterable kustom, kita masih perlu melakukannya pada Array, karena Array tidak memiliki dukungan ini di ES5 / ES3, dan kita tidak ingin melakukan emit yang diarahkan tipe, kita perlu mengonversi larik ke iterable, yang secara drastis lebih lambat dari loop normal Anda. dan masalah utamanya adalah tidak jelasnya melihat loop pada array yang akan menimbulkan biaya ini.

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat