TypeScriptTypy podstawowe
never
Typ wartości, która nigdy nie wystąpi: funkcji, które nie kończą się normalnie, i niemożliwych przypadków.
Przykład
#TypeScript
type Shape = { kind: 'circle'; r: number } | { kind: 'square'; side: number }
function assertNever(value: never): never {
throw new Error(`Nieobsłużony przypadek: ${JSON.stringify(value)}`)
}
function area(shape: Shape): number {
switch (shape.kind) {
case 'circle':
return Math.round(Math.PI * shape.r ** 2)
case 'square':
return shape.side ** 2
default:
return assertNever(shape)
}
}
console.log(area({ kind: 'circle', r: 2 }))
console.log(area({ kind: 'square', side: 3 }))Wynik
13 9
Definicja i zastosowanie
#Typ never opisuje sytuację, która nie może się zdarzyć. Funkcja zwracająca never nigdy nie kończy się zwykłym powrotem: zawsze rzuca wyjątek albo działa w nieskończonej pętli.
Najbardziej praktyczne zastosowanie to sprawdzanie kompletności. Jeśli obsługujesz wszystkie warianty unii w switch, w gałęzi default wartość ma typ never. Gdy ktoś doda nowy wariant i zapomni go obsłużyć, kompilator zgłosi błąd.
never pojawia się też samoczynnie jako wynik zawężania, gdy odrzucisz wszystkie możliwe typy, oraz w typach warunkowych jako sposób na „usunięcie” członu unii.
Składnia
#Składnia
function fail(message: string): never {
throw new Error(message)
}Dobre praktyki
#- Funkcja
assertNeverw gałęzidefaultto prosty sposób, żeby kompilator przypominał o nowych wariantach. - Nie używaj
neverjako „pustego typu” dla zmiennych. Nie da się do niego nic przypisać.
Powiązane hasła
#- Unie rozróżnialneUnie obiektów ze wspólnym polem-etykietą, które pozwala łatwo odróżnić warianty.
- voidTyp zwracany przez funkcje, które nic nie zwracają.
- Zawężanie typówUstalanie dokładniejszego typu wartości na podstawie sprawdzeń w kodzie.
- Typy warunkoweTypy wybierane na podstawie warunku: T extends U ? X : Y.
Widzisz błąd albo brakuje przykładu? Napisz do nas.