"noUncheckedIndexedAccess"
Dodaje undefined do typu odczytu po indeksie, bo elementu o takim indeksie może nie być.
Przykład
#{
"compilerOptions": {
"strict": true,
"noUncheckedIndexedAccess": true
}
}Definicja i zastosowanie
#Domyślnie odczyt z tablicy po indeksie (scores[3]) albo z obiektu przez sygnaturę indeksu (prices[course]) ma typ elementu, np. number. W działającym programie taki odczyt może jednak zwrócić undefined. Opcja noUncheckedIndexedAccess dopisuje do typu | undefined, więc kompilator wymusza obsługę brakującego elementu.
Opcja nie należy do grupy strict i trzeba ją włączyć osobno. Nie dotyczy pól zadeklarowanych w typie z nazwy ani krotek odczytywanych stałym indeksem (pair[0] przy typie [string, number]). Pętla for...of i metody takie jak map() nadal podają elementy zwykłego typu.
Po włączeniu w istniejącym projekcie pojawi się sporo miejsc do poprawy, zwykle obsługiwanych przez ??, ?. albo warunek. W zamian znika cała klasa błędów „Cannot read properties of undefined”. Od TypeScriptu 5.9 opcja jest włączona w pliku tworzonym przez tsc --init.
Składnia
#"noUncheckedIndexedAccess": trueWięcej przykładów
#const scores = [72, 95, 88]
const fourth = scores[3]
// const fourth: number | undefined
// fourth.toFixed(1)
// Błąd: 'fourth' is possibly 'undefined'.
console.log((fourth ?? 0).toFixed(1))
console.log(scores[0]?.toFixed(1))0.0 72.0
const prices: Record<string, number> = { html: 49, python: 79 }
function priceLabel(course: string): string {
const price = prices[course]
// const price: number | undefined
return price === undefined ? 'brak w ofercie' : `${price} zł`
}
console.log(priceLabel('python'))
console.log(priceLabel('rust'))79 zł brak w ofercie
Dobre praktyki
#- Sprawdzenie
scores.length > 0nie zawęża typuscores[0]. Zapisz element w zmiennej i sprawdź ją:const first = scores[0]; if (first !== undefined) …. - Zamiast pętli z indeksem używaj
for...of,map()alboforEach(). Element ma wtedy zwykły typ, bez| undefined. - W istniejącym projekcie włącz opcję na osobnej gałęzi i poprawiaj błędy partiami. Większość poprawek to dopisanie
??albo warunku.
Powiązane hasła
#- "strict"Włącza zestaw najważniejszych, rygorystycznych sprawdzeń kompilatora.
- "strictNullChecks"Traktuje null i undefined jako osobne typy, wymuszając ich obsługę.
- Sygnatura indeksuOpis obiektów o dowolnych kluczach i wartościach jednego typu.
- Tablice: number[] i Array<T>Typy tablic, w których wszystkie elementy mają ten sam typ.
- Record<Keys, Type>Tworzy typ obiektu o podanych kluczach, w którym każda wartość ma ten sam typ.
Widzisz błąd albo brakuje przykładu? Napisz do nas.