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