"noUncheckedIndexedAccess"

Dodaje undefined do typu odczytu po indeksie, bo elementu o takim indeksie może nie być.

Na tej stronie

Przykład

#
JSON
{
  "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

#
Składnia
"noUncheckedIndexedAccess": true

Więcej przykładów

#
Odczyt z tablicy
TypeScript
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))
Wynik
0.0
72.0
Słownik z dowolnymi kluczami
TypeScript
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'))
Wynik
79 zł
brak w ofercie

Dobre praktyki

#
  • Sprawdzenie scores.length > 0 nie zawęża typu scores[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() albo forEach(). 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

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.