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.

Na tej stronie

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 assertNever w gałęzi default to prosty sposób, żeby kompilator przypominał o nowych wariantach.
  • Nie używaj never jako „pustego typu” dla zmiennych. Nie da się do niego nic przypisać.

Powiązane hasła

#

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