Loops no TypeScript e os tipos que eles geram

Loops no TypeScript

Loops no TypeScript: for...of, for...in, forEach e tipos | We.Inc

Veja o tipo que o TypeScript dá à variável do loop em for, for...of, for...in e forEach, por que obj[key] falha dentro do for...in e como percorrer objetos e Maps com segurança.

O TypeScript tem os mesmos loops do JavaScript: for, for...of, for...in, while, do...while e o método de array forEach. O que ele acrescenta é um tipo para cada variável de loop. for...of dá o tipo do elemento, for...in sempre dá chaves string, e forEach passa o tipo do elemento ao callback, que não pode ser interrompido antes do fim.

O tipo da variável do loop

Escolha um cenário para ver o código, o tipo que o compilador atribui à variável do loop e o que o loop imprime ao rodar. Dois deles são erros de compilação de propósito, porque são os loops em que as pessoas mais travam no TypeScript.

Perguntas frequentes

Por que a chave é string em um loop for...in?

for...in visita chaves string enumeráveis, incluindo as herdadas pela cadeia de protótipos, e o TypeScript não consegue descartar chaves extras em um objeto em tempo de execução. Tipar a chave como keyof T seria uma promessa que a linguagem não consegue cumprir, então ela continua string.

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

Mude para Object.entries(obj) para pegar chaves e valores juntos, ou faça o cast das chaves uma vez: for (const k of Object.keys(obj) as (keyof typeof obj)[]). Só faça o cast quando souber que o objeto não tem chaves extras.

Dá para sair de um forEach no TypeScript?

Não. Como no JavaScript, o forEach só para se o callback lançar um erro. Use for...of com break, ou some() e find(), que param na primeira correspondência.

for...of funciona em um Map no TypeScript?

Sim, com target ES2015 ou posterior. Cada volta entrega um par [key, value] tipado a partir dos generics do Map. Para targets mais antigos, ligue downlevelIteration.

Que tipo tem o contador de um for clássico?

let i = 0 infere number, e a[i] dá o tipo do elemento. Com noUncheckedIndexedAccess ligado, a[i] vira o tipo do elemento ou undefined, o que é mais rígido, porém mais fiel à realidade.

Os loops são JavaScript; os tipos são a novidade

Percorrendo objetos sem erros

Estreitando tipos dentro de um loop

Loops e código assíncrono

Aguarde um de cada vez com for...of

Cada requisição espera a anterior. O array de resultados é tipado pelo tipo de retorno da função.

Rode todas juntas com Promise.all

map inicia todas as requisições de uma vez e Promise.all espera por todas. A ordem dos resultados segue a ordem dos ids.

for...of em array

s: number

O tipo do elemento de number[] vai direto para a variável do loop.

for...in em objeto

k: string

A chave é uma string simples, então usá-la para indexar um objeto tipado falha no strict mode.

Object.entries

name: string, price: number

Aqui Object.entries retorna [string, number][], então as duas metades do par são tipadas.

Chaves como keyof

k: "tea" | "cake"

Um cast único diz ao compilador que as chaves são exatamente as declaradas. Seguro só quando o objeto não pode ter chaves extras.

for...in em array

i: string

Os índices do array chegam como strings no for...in, então atribuir um a uma variável number falha.

for...of em Map

item: string, qty: number

Desestruturar a entrada dá os dois tipos genéricos, na ordem em que as entradas foram adicionadas pela primeira vez.

forEach em tupla

x: string | number

O forEach vê uma tupla como um array da union dos tipos dos elementos, então estreite com typeof.

Lista as const

as const mantém os valores literais, então a variável do loop é uma union que você pode tratar por completo em um switch.

Que tipo a variável do loop recebe?

Escolha um cenário de loop

Tipo:

Saída

Erro de compilação do tsc

Comece grátis · Sem cartão de crédito

Relacionados: Guias

Produto

Para quem é

Recursos

Recursos

Empresa

Mapa do site