Cicli in TypeScript e i tipi che ti danno

Cicli in TypeScript

Cicli in TypeScript: for...of, for...in, forEach e tipi | We.Inc

Il tipo che TypeScript assegna alla variabile del ciclo in for, for...of, for...in e forEach, perché obj[key] fallisce dentro for...in e come iterare oggetti e Map in sicurezza.

TypeScript ha gli stessi cicli di JavaScript: for, for...of, for...in, while, do...while e il metodo degli array forEach. Ciò che aggiunge è un tipo per ogni variabile del ciclo. for...of dà il tipo dell'elemento, for...in dà sempre chiavi string, e forEach passa il tipo dell'elemento alla sua callback, che non può interrompersi in anticipo.

Il tipo della variabile del ciclo

Scegli uno scenario per vedere il codice, il tipo che il compilatore assegna alla variabile del ciclo e cosa stampa il ciclo quando viene eseguito. Due di questi sono errori di compilazione di proposito, perché sono i cicli su cui ci si blocca più spesso in TypeScript.

Domande frequenti

Perché la chiave è una stringa in un ciclo for...in?

for...in visita le chiavi string enumerabili, comprese quelle ereditate lungo la prototype chain, e TypeScript non può escludere chiavi extra su un oggetto a runtime. Tipizzare la chiave come keyof T sarebbe una promessa che il linguaggio non può mantenere, quindi resta string.

Come risolvo "Element implicitly has an 'any' type because expression of type 'string' can't be used to index"?

Passa a Object.entries(obj) per avere chiavi e valori insieme, oppure fai un cast delle chiavi una sola volta: for (const k of Object.keys(obj) as (keyof typeof obj)[]). Fai il cast solo quando sai che l'oggetto non ha chiavi extra.

Posso uscire da un forEach in TypeScript?

No. Come in JavaScript, forEach si ferma solo se la callback lancia un'eccezione. Usa for...of con break, oppure some() e find(), che si fermano alla prima corrispondenza.

for...of funziona su una Map in TypeScript?

Sì, con un target ES2015 o successivo. Ogni giro restituisce una coppia [key, value] tipizzata dai generics della Map. Per target più vecchi, attiva downlevelIteration.

Che tipo ha il contatore di un classico ciclo for?

let i = 0 viene inferito come number, e a[i] dà il tipo dell'elemento. Con noUncheckedIndexedAccess attivo, a[i] diventa il tipo dell'elemento o undefined, che è più rigoroso ma più vicino alla realtà.

I cicli sono JavaScript; i tipi sono la parte nuova

Iterare gli oggetti senza errori

Narrowing dentro un ciclo

Cicli e codice asincrono

Await uno alla volta con for...of

Ogni richiesta aspetta la precedente. L'array dei risultati è tipizzato dal tipo di ritorno della funzione.

Eseguile insieme con Promise.all

map avvia tutte le richieste subito e Promise.all le aspetta tutte. L'ordine dei risultati corrisponde all'ordine degli id.

for...of su array

s: number

Il tipo dell'elemento di number[] passa direttamente nella variabile del ciclo.

for...in su oggetto

k: string

La chiave è una semplice stringa, quindi usarla per indicizzare un oggetto tipizzato fallisce in strict mode.

Object.entries

name: string, price: number

Qui Object.entries restituisce [string, number][], quindi entrambe le metà della coppia sono tipizzate.

Chiavi come keyof

k: "tea" | "cake"

Un cast una tantum dice al compilatore che le chiavi sono esattamente quelle dichiarate. Sicuro solo quando l'oggetto non può avere chiavi extra.

for...in su array

i: string

In for...in gli indici dell'array arrivano come stringhe, quindi assegnarne uno a una variabile number fallisce.

for...of su Map

item: string, qty: number

Destrutturare la entry dà entrambi i tipi generici, nell'ordine in cui le entry sono state aggiunte la prima volta.

forEach su tuple

x: string | number

forEach vede una tuple come un array della union dei tipi dei suoi elementi, quindi restringi con typeof.

Lista as const

as const mantiene i valori letterali, quindi la variabile del ciclo è una union su cui puoi fare uno switch esaustivo.

Che tipo riceve la variabile del ciclo?

Scegli uno scenario di ciclo

Tipo:

Output

Errore di compilazione di tsc

Inizia gratis · Nessuna carta di credito richiesta

Correlati: Guide

Prodotto

Per chi è

Funzionalità

Risorse

Azienda

Mappa del sito