Skip to content

Commit e58ab6b

Browse files
committed
TSConfig Italian translation: downlevelIteration.md
1 parent 65e2565 commit e58ab6b

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
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

Comments
 (0)