Strażnicy typów (value is T)

Własne funkcje sprawdzające, które zawężają typ w miejscu wywołania.

Na tej stronie

Przykład

#
TypeScript
interface Course {
  title: string
  modules: number
}

function isCourse(value: unknown): value is Course {
  return (
    typeof value === 'object' &&
    value !== null &&
    typeof (value as Course).title === 'string' &&
    typeof (value as Course).modules === 'number'
  )
}

const data: unknown = JSON.parse('{"title":"Python","modules":12}')

if (isCourse(data)) {
  console.log(`${data.title}: ${data.modules} modułów`)
}
Wynik
Python: 12 modułów

Definicja i zastosowanie

#

Strażnik typu to funkcja zwracająca boolean, której typ zwracany zapisuje się jako predykat: value is Course. Jeśli funkcja zwróci true, kompilator uzna, że wartość ma podany typ.

Pozwala to zamknąć złożone sprawdzenie w jednym miejscu i używać go jak wbudowanych typeof czy instanceof. Szczególnie przydaje się przy danych z API, sprawdzaniu kształtu obiektów i filtrowaniu tablic.

Od TypeScriptu 5.5 kompilator potrafi sam wywnioskować predykat dla prostych funkcji, na przykład x => x !== null przekazanej do filter().

Składnia

#
Składnia
function isTyp(value: unknown): value is Typ {
  return …
}

Więcej przykładów

#
Filtrowanie z zawężeniem
TypeScript
const values = ['HTML', null, 'CSS', undefined]
const names = values.filter((v): v is string => typeof v === 'string')

console.log(names)
Wynik
['HTML', 'CSS']

Dobre praktyki

#
  • Strażnik musi naprawdę sprawdzać to, co obiecuje. Kompilator ufa predykatowi i nie weryfikuje jego logiki.
  • Do rozbudowanej walidacji danych z API warto użyć biblioteki, np. Zod, która generuje typy i sprawdzenia z jednego schematu.

Powiązane hasła

#

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