TypeScriptUnie i zawężanie
Strażnicy typów (value is T)
Własne funkcje sprawdzające, które zawężają typ w miejscu wywołania.
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
#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
#- Zawężanie typówUstalanie dokładniejszego typu wartości na podstawie sprawdzeń w kodzie.
- unknownBezpieczny odpowiednik any: wartość nieznanego typu, której trzeba najpierw sprawdzić.
- typeof (w typach)Pobiera typ zmiennej lub wartości, żeby użyć go w innym miejscu.
- Unie rozróżnialneUnie obiektów ze wspólnym polem-etykietą, które pozwala łatwo odróżnić warianty.
Widzisz błąd albo brakuje przykładu? Napisz do nas.