Hva er forskjellen mellom never og void i TypeScript?


Jeg har lest dette, men det er uklart hva som ville være forskjellen mellom 'never' og 'void'-typen?

Svar #1

Som Marius Schulz diskuterer i denne artikkelen,

  • En funksjon som ikke eksplisitt returnerer en verdi returnerer implisitt verdien undefined i JavaScript. Selv om vi vanligvis sier at en slik funksjon "ikke returnerer noe", så returnerer den. Vi ignorerer vanligvis returverdien i disse tilfellene. En slik funksjon antas å ha typen void som returtype i TypeScript.
  • En funksjon som har typen never returnerer aldri. Den returnerer ikke undefined heller. Funksjonen har ikke en normal fullføring, noe som betyr at den kaster en feil eller aldri fullfører kjøringen.

Svar #2

I imperative språk kan void betraktes som en type som inneholder en enkelt verdi. Slike språk gir ikke en måte å konstruere eller bruke denne verdien på, men en void-funksjon kan betraktes som å returnere denne trivielle verdien.

I kontrast never er en type som ikke inneholder noen verdier, noe som betyr at en funksjon med denne returtypen aldri kan returnere normalt i det hele tatt. Dette betyr enten å kaste et unntak eller å mislykkes i å avslutte.

Svar #3

For å supplere Lees veldig gode svar, er en annen måte å tenke på det at i et korrekt-typet program kan en never-verdi ikke observeres.

I tillegg til funksjoner som aldri returnerer (eller som alltid kaster unntak), vil du se never-typen når en unionstype har blitt tømt for alle sine mulige bestanddeler:

// Example assumes --strictNullChecks
function fn(x: number | string) {
  if (typeof x === 'number') {
    // x: number in this block
  } else if (typeof x === 'string') {
    // x: string in this block
  } else {
    // x: never in this block
    // this block does not run; the value of x cannot be observed
  }
}

Svar #4

Kort sagt:

void returnerer void, never returnerer aldri.

Svar #5

Også, av en mer teoretisk grunn, med den nye flagget --strictNullChecks, trengte TypeScript en ny bunn-type (siden null og undefined ikke lenger finnes). Typen never er en slik bunn-type og gjør TypeScripts typesystem mer konsistent.

Relaterte artikler