typescript - Oppdage at en funksjon returnerte `void` (i stedet for `undefined`)


Jeg hørte et rykte om at void betyr null|undefined. Tross alt er denne koden lovlig:

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

Men jeg har et problem som trosser denne forståelsen.

REDIGER: Problemet forsvant da jeg startet Visual Studio Code på nytt. Det viser seg at problemet beskrevet nedenfor kun oppstår hvis strictNullChecks er av. Jeg bruker "strictNullChecks": true, så jeg antar at noe forvirret IDE-en et øyeblikk, og det var overraskende at nye feil kunne oppstå på grunn av en mindre streng modus. Jeg bør nevne at i strictNullChecks-modus er var y: void=null en feil. Dette etterlater meg bare med ett spørsmål: hva er forskjellen mellom void og undefined i streng modus?

Jeg ønsket å definere en callback for en datastruktur som kunne returnere en verdi, men ikke nødvendigvis må. Spesielt kan du returnere {stop:true} for å stoppe iterasjonen. Koden min startet slik, noe som ikke fungerte dersom funksjonen ikke returnerte en verdi:

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) => {});

Feilmeldingen (som i seg selv ser ut til å være feil) forsvinner hvis jeg bruker

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

Men det kommer tilbake hvis jeg bruker

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

Men hvis jeg bruker {stop?:boolean} | void, hvordan sjekker jeg om funksjonen returnerte void? Den vanlige typingen basert på kontrollflyt fungerer ikke her:

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 ...;
}

Jeg har en tendens til å tro at dette enten er en kompilatorfeil eller en dårlig gjennomtenkt designbeslutning, men finnes det en enkel løsning som jeg overser?

tsc --version: 2.9.2 (med mindre IntelliSense-versjonen er annerledes)

Svar #1

[ORIGINELT SVAR]

Denne formen av din if-test unngår feilen:

if (result instanceof Object) {

[BEDRE SVAR]

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

Denne koden vil ikke generere kompilatorfeil hvis x er av typen void (udefinert).

Relaterte artikler