TypeScriptUnie i zawężanie
Operator in
Zawęża typ unii obiektów, sprawdzając, czy obiekt ma daną właściwość.
Przykład
#TypeScript
type EmailContact = { name: string; email: string }
type PhoneContact = { name: string; phone: string }
function contactLine(contact: EmailContact | PhoneContact): string {
if ('email' in contact) return `${contact.name}: ${contact.email}`
return `${contact.name}: tel. ${contact.phone}`
}
console.log(contactLine({ name: 'Ania', email: 'ania@codeworlds.pl' }))
console.log(contactLine({ name: 'Kuba', phone: '+48 600 100 200' }))Wynik
Ania: ania@codeworlds.pl Kuba: tel. +48 600 100 200
Definicja i zastosowanie
#Operator in sprawdza, czy obiekt ma właściwość o podanej nazwie. W TypeScripcie służy do zawężania unii obiektów bez wspólnej etykiety: po if ("email" in contact) kompilator wie, że to wariant z polem email.
To wygodne, gdy warianty różnią się zestawem pól, a nie mają pola typu kind. Jeśli możesz zmienić strukturę danych, unia rozróżnialna jest zwykle czytelniejsza.
Od TypeScriptu 4.9 operator in zawęża też wartości typu object i unknown: po sprawdzeniu kompilator wie, że właściwość istnieje, choć jej typ to unknown.
Składnia
#Składnia
if ("pole" in obiekt) {
// obiekt ma pole
}Dobre praktyki
#- Operator
insprawdza też właściwości dziedziczone. Do sprawdzenia tylko własnych pól użyjObject.hasOwn(). - Gdy wariantów przybywa, zamień je na unię rozróżnialną z polem
kind.
Powiązane hasła
#- Zawężanie typówUstalanie dokładniejszego typu wartości na podstawie sprawdzeń w kodzie.
- Unie rozróżnialneUnie obiektów ze wspólnym polem-etykietą, które pozwala łatwo odróżnić warianty.
- instanceofZawęża typ do klasy, sprawdzając, czy obiekt został przez nią utworzony.
- Strażnicy typów (value is T)Własne funkcje sprawdzające, które zawężają typ w miejscu wywołania.
Widzisz błąd albo brakuje przykładu? Napisz do nas.