typescript - Otkrivanje da je funkcija vratila `void` (umjesto `undefined`)


Čuo sam trač da void znači null|undefined. Uostalom, ovaj kod je legalan:

var x: void = undefined, y: void = null;

Ali imam problem koji prkosi ovom razumijevanju.

UREĐIVANJE: Problem je nestao kada sam ponovno pokrenuo Visual Studio Code. Ispostavilo se da problem opisan u nastavku nastaje samo ako je strictNullChecks isključen. Ja koristim "strictNullChecks": true, pa pretpostavljam da je nešto na trenutak zbunilo IDE, i bilo je iznenađujuće da novi pogreške mogu nastati zbog manje strogog načina rada. Trebalo bi spomenuti da u načinu rada strictNullChecks, var y: void=null predstavlja pogrešku. To mi ostavlja samo jedno pitanje: koja je razlika između void i undefined u strogom načinu rada?

Htio sam definirati povratnu funkciju za podatkovnu strukturu koja bi mogla vratiti vrijednost, ali ne mora. Konkretno, možete vratiti {stop:true} kako biste zaustavili iteraciju. Moj kod je počeo ovako, što nije funkcioniralo u slučaju da funkcija ne vrati vrijednost:

type ForRangeResult = {stop?:boolean} | undefined;
class BTree<K=any,V=any> {
  forEach(callback: (k:K, v:V) => ForRangeResult): number { ... }
  ...
}

// Type 'void' is not assignable to type '{ stop?: boolean; }'.
new BTree().forEach((k,v) => {});

Poruka o pogrešci (koja sama po sebi izgleda netočno) nestaje ako koristim

type ForRangeResult = {stop?:boolean} | void;

Ali se vrati ako koristim

type ForRangeResult = {stop?:boolean} | undefined | null;

Međutim, ako koristim {stop?:boolean} | void, kako mogu provjeriti je li funkcija vratila void? Uobičajeno tipiziranje temeljeno na kontrolnom toku ovdje ne radi:

var result = callback(keys[i], values[i]);
if (result !== undefined && result !== null) {
  // [ts] Property 'stop' does not exist on type 'void'
  if (result.stop)
    return ...;
}

Sklon sam misliti da je ovo ili greška kompajlera ili loše osmišljena dizajnerska odluka, ali postoji li neki jednostavan popravak koji možda propuštam?

tsc --version: 2.9.2 (osim ako je verzija IntelliSense drugačija)

Odgovor #1

[IZVORNI ODGOVOR]

Ovaj oblik vašeg if testa izbjegava pogrešku:

if (result instanceof Object) {

[BOLJI ODGOVOR]

if (x !== null && typeof x === 'object') {

Ovaj kod neće generirati pogreške prevoditelja ako je x tipa void (nedefinirano).

Povezani članci