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).
