|
| 1 | +--- |
| 2 | +display: "Iterazione di livello inferiore" |
| 3 | +oneline: "Emette Javascript compatibile e più dettagliato per oggetti iterativi" |
| 4 | +--- |
| 5 | + |
| 6 | +Iterazione di livello inferiore, o Downleveling, è un termine di TypeScript utilizzato per migrare verso una versione precedente di JavaScript. Questa flag permette quindi di supportare una più accurata implementazione di come il JavaScript moderno itera i nuovi concetti in versioni precedenti di JavaScript in runtime. |
| 7 | + |
| 8 | +ECMAScript 6 aggiunge una serie di nuove iterazioni primitive: il `for / of` loop (`for (el of arr)`), spread di Array (`[a, ...b]`), spread di argomenti (`fn (... args)`) e [`Symbol.iterator`](https://medium.com/trainingcenter/iterators-em-javascript-880adef14495).`--downlevelIteration` permette a queste iterazioni primitive di essere utilizzate in modo più accurrato in un ambiente ES5 se un'implementazione di [`Symbol.iterator`](https://medium.com/trainingcenter/iterators-em-javascript-880adef14495) è presente. |
| 9 | + |
| 10 | +#### Esempio: Effetti su `for / of` |
| 11 | + |
| 12 | +Con questo codice TypeScript: |
| 13 | + |
| 14 | +```js |
| 15 | +const str = "Ciao!"; |
| 16 | +for (const s of str) { |
| 17 | + console.log(s); |
| 18 | +} |
| 19 | +``` |
| 20 | + |
| 21 | +Senza `downlevelIteration` attivo, un loop `for / of` su un qualsiasi oggetto viene convertito in un tradizionale `for` loop: |
| 22 | + |
| 23 | +```ts twoslash |
| 24 | +// @target: ES5 |
| 25 | +// @showEmit |
| 26 | +const str = "Ciao!"; |
| 27 | +for (const s of str) { |
| 28 | + console.log(s); |
| 29 | +} |
| 30 | +``` |
| 31 | + |
| 32 | +Generalmente tutti si aspettano questo, tuttavia non è compatibile al 100% con il protocollo di iterazione ECMAScript 6. Certe string, ad esempio un emoji (😜), hanno un `.length` di 2 (o anche di più!), ma dovrebbero iterare come 1 unità in un `for-of` loop. Guarda [questo blog post di Jonathan New](https://blog.jonnew.com/posts/poo-dot-length-equals-two) per una spiegazione più dettagliata. |
| 33 | + |
| 34 | +Quando `downlevelIteration` è attivo, TypeScript utilizzerà una funzione ausiliaria che andrà a controllare la presenza di un `Symbol.iterator` (che può essere di tipo nativo o polyfill). Nel caso in cui questa implementazione non ci sia, ritornerai ad un'iterazione index-based. |
| 35 | + |
| 36 | +```ts twoslash |
| 37 | +// @target: ES5 |
| 38 | +// @downlevelIteration |
| 39 | +// @showEmit |
| 40 | +const str = "Ciao!"; |
| 41 | +for (const s of str) { |
| 42 | + console.log(s); |
| 43 | +} |
| 44 | +``` |
| 45 | + |
| 46 | +Puoi utilizzare [tslib](https://www.npmjs.com/package/tslib) via [importHelpers](https://www.typescriptlang.org/tsconfig#importHelpers) in modo da ridurre il numero di righe inline Javascript: |
| 47 | + |
| 48 | +```ts twoslash |
| 49 | +// @target: ES5 |
| 50 | +// @downlevelIteration |
| 51 | +// @importHelpers |
| 52 | +// @showEmit |
| 53 | +const str = "Ciao!"; |
| 54 | +for (const s of str) { |
| 55 | + console.log(s); |
| 56 | +} |
| 57 | +``` |
| 58 | + |
| 59 | +> > **Nota:** attivare `downlevelIteration` non andrà a migliorare le prestazioni di compliazione se `Symbol.iterator` non è presente in runtime. |
| 60 | +
|
| 61 | +#### Esempio: Effetti sullo spray di Array |
| 62 | + |
| 63 | +Questo è un spread di array: |
| 64 | + |
| 65 | +```js |
| 66 | +// Crea un nuovo array composto dall'elemento 1 seguito dagli elementi di arr2 |
| 67 | +const arr = [1, ...arr2]; |
| 68 | +``` |
| 69 | + |
| 70 | +Secondo la descrizione, sembra facile convertirlo in ES5: |
| 71 | + |
| 72 | +```js |
| 73 | +// Stessa cosa, no? |
| 74 | +const arr = [1].concat(arr2); |
| 75 | +``` |
| 76 | + |
| 77 | +Tuttavia, questo è visibilmente diverso in certi rari casi. Ad esempio, nel caso un array abbia un "buco", l'index mancante andrà a creare una proprietà *own* nel caso si decida di applicare uno spread, ma non se creato utilizzando `.concat`: |
| 78 | + |
| 79 | +```js |
| 80 | +// Crea un array dove manca l'elemento '1' |
| 81 | +let mancante = [0, , 1]; |
| 82 | +let spread = [...mancante]; |
| 83 | +let concatenato = [].concat(mancante); |
| 84 | + |
| 85 | +// true |
| 86 | +"1" in spread; |
| 87 | +// false |
| 88 | +"1" in concatenato; |
| 89 | +``` |
| 90 | + |
| 91 | +Proprio come un `for / of`, `downlevelIteration` andrà ad usare `Symbol.iterator` (se presente) in modo da emulare in modo più preciso il comportamento di ES 6. |
0 commit comments