Pętle w TypeScript i typy, które z nich wynikają

Pętle w TypeScript

Pętle w TypeScript: for...of, for...in, forEach i typy | We.Inc

Zobacz, jaki typ TypeScript nadaje zmiennej pętli w for, for...of, for...in i forEach, dlaczego obj[key] zawodzi w for...in i jak bezpiecznie iterować po obiektach i Map.

TypeScript ma te same pętle co JavaScript: for, for...of, for...in, while, do...while oraz metodę tablicową forEach. Dodaje natomiast typ dla każdej zmiennej pętli. for...of daje typ elementu, for...in zawsze daje klucze typu string, a forEach przekazuje typ elementu do callbacku, którego nie da się przerwać wcześniej.

Typ zmiennej pętli

Wybierz scenariusz, aby zobaczyć kod, typ, jaki kompilator przypisuje zmiennej pętli, oraz to, co pętla wypisuje po uruchomieniu. Dwa z nich celowo są błędami kompilacji, bo to właśnie przy tych pętlach ludzie najczęściej utykają w TypeScript.

Najczęściej zadawane pytania

Dlaczego klucz w pętli for...in jest typu string?

for...in odwiedza przeliczalne klucze tekstowe, także te dziedziczone przez łańcuch prototypów, a TypeScript nie może wykluczyć dodatkowych kluczy w obiekcie w czasie działania. Otypowanie klucza jako keyof T byłoby obietnicą, której język nie może dotrzymać, więc pozostaje string.

Jak naprawić "Element implicitly has an 'any' type because expression of type 'string' can't be used to index"?

Przejdź na Object.entries(obj), aby dostać klucze i wartości razem, albo rzutuj klucze jeden raz: for (const k of Object.keys(obj) as (keyof typeof obj)[]). Rzutuj tylko wtedy, gdy wiesz, że obiekt nie ma dodatkowych kluczy.

Czy mogę przerwać forEach w TypeScript?

Nie. Tak jak w JavaScripcie, forEach zatrzymuje się tylko wtedy, gdy callback rzuci wyjątek. Użyj for...of z break albo some() i find(), które zatrzymują się na pierwszym dopasowaniu.

Czy for...of działa na Map w TypeScript?

Tak, przy docelowej wersji ES2015 lub nowszej. Każde przejście daje parę [key, value] otypowaną na podstawie generyków Map. Dla starszych wersji docelowych włącz downlevelIteration.

Jaki typ ma licznik klasycznej pętli for?

let i = 0 jest inferowane jako number, a a[i] daje typ elementu. Przy włączonym noUncheckedIndexedAccess a[i] staje się typem elementu lub undefined, co jest bardziej rygorystyczne, ale bliższe prawdy.

Pętle to JavaScript, nowością są typy

Iteracja po obiektach bez błędów

Zawężanie wewnątrz pętli

Pętle i kod asynchroniczny

Czekaj na każde po kolei z for...of

Każde żądanie czeka na poprzednie. Tablica wyników jest otypowana na podstawie typu zwracanego funkcji.

Uruchom je razem z Promise.all

map uruchamia wszystkie żądania naraz, a Promise.all czeka na wszystkie. Kolejność wyników odpowiada kolejności ids.

for...of po tablicy

s: number

Typ elementu number[] trafia prosto do zmiennej pętli.

for...in po obiekcie

k: string

Klucz to zwykły string, więc indeksowanie nim otypowanego obiektu zawodzi w trybie strict.

Object.entries

name: string, price: number

Object.entries zwraca tu [string, number][], więc obie połowy pary są otypowane.

Klucze jako keyof

k: "tea" | "cake"

Jednorazowe rzutowanie mówi kompilatorowi, że klucze są dokładnie tymi zadeklarowanymi. Bezpieczne tylko wtedy, gdy obiekt nie może mieć dodatkowych kluczy.

for...in po tablicy

i: string

W for...in indeksy tablicy przychodzą jako stringi, więc przypisanie jednego z nich do zmiennej number zawodzi.

for...of po Map

item: string, qty: number

Destrukturyzacja wpisu daje oba typy generyczne, w kolejności, w jakiej wpisy zostały pierwotnie dodane.

forEach po krotce

x: string | number

forEach widzi krotkę jako tablicę unii typów jej elementów, więc zawężaj przez typeof.

Lista as const

as const zachowuje wartości literałowe, więc zmienna pętli jest unią, którą możesz wyczerpująco obsłużyć w switch.

Jaki typ dostaje zmienna pętli?

Wybierz scenariusz pętli

Typ:

Wynik

Błąd kompilacji z tsc

Zacznij za darmo · Bez karty kredytowej

Powiązane: Poradniki

Produkt

Dla kogo

Funkcje

Zasoby

Firma

Mapa strony