Unie
NonNullable
Usuwa `null` i `undefined` z typu.
Czym jest
Warto przeczytać definicję. Kiedyś był dystrybutywnym warunkiem; od TypeScriptu 4.8 to `T & {}`, bo przecięcie z pustym typem obiektowym usuwa dokładnie te dwa typy, które nie mogą mieć właściwości. Krócej, szybciej i już nie dystrybutywnie — co ma znaczenie tylko w narożnikach.
Przykłady
NonNullable<string | null>
→stringNonNullable<string | undefined | null>
→stringNonNullable<null>→never
Każdy rozwinięty typ powyżej wypisał TypeScript 5.9.3, nie ręka człowieka.
Czego nie robi
- Nie rusza zagnieżdżonej właściwości. `NonNullable<{ a: string | null }>` pozostaje bez zmian — nullowalność jest w środku, a to działa na zewnątrz.
- Nie zawęża wartości w czasie wykonania. Zmienna typu `string | null` wciąż potrzebuje sprawdzenia; to tylko opisuje typ po nim.
Wniosek
Definicja zmieniła się wszystkim pod nogami w 4.8 i prawie nikt nie zauważył — to argument za cytowaniem definicji zamiast pamiętania ich.