typescript - Zistenie, že funkcia vrátila `void` (namiesto `undefined`)
Počul som klebetu, že void znamená null|undefined. Napokon, tento kód je legálny:
var x: void = undefined, y: void = null;
Ale mám problém, ktorý popiera toto chápanie.
EDIT: Problém zmizol, keď som reštartoval Visual Studio Code. Ukázalo sa, že problém opísaný nižšie sa vyskytuje iba vtedy, ak je strictNullChecks vypnutý. Používam "strictNullChecks": true, takže predpokladám, že IDE bolo na chvíľu zmätené, a bolo prekvapivé, že nové chyby mohli byť spôsobené menej prísnym režimom. Mal by som spomenúť, že v režime strictNullChecks je var y: void=null chyba. Zostáva mi teda už len jedna otázka: aký je rozdiel medzi void a undefined v prísnom režime?
Chcel som definovať spätné volanie pre dátovú štruktúru, ktorá by mohla vrátiť hodnotu, ale nemusí. Konkrétne môžete vrátiť {stop:true}, aby ste zastavili iteráciu. Môj kód začínal takto, čo nefungovalo v prípade, že funkcia nevrátila hodnotu:
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) => {});
Chybové hlásenie (ktoré samo o sebe sa zdá byť nesprávne) zmizne, ak použijem
type ForRangeResult = {stop?:boolean} | void;
Ale vráti sa to, ak použijem
type ForRangeResult = {stop?:boolean} | undefined | null;
Avšak, ak použijem {stop?:boolean} | void, ako skontrolujem, či funkcia vrátila void? Bežné typovanie založené na riadení toku tu nefunguje:
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 ...;
}
Som naklonený myslieť si, že ide buď o chybu kompilátora, alebo o zle premyslené dizajnové rozhodnutie, ale existuje nejaká jednoduchá oprava, ktorú prehliadam?
tsc --version: 2.9.2 (pokiaľ sa verzia IntelliSense nelíši)
Odpoveď č. 1
[PÔVODNÁ ODPOVEĎ]
Táto forma vášho testu if zabraňuje chybe:
if (result instanceof Object) {
[LEPŠIA ODPOVEĎ]
if (x !== null && typeof x === 'object') {
Tento kód nevygeneruje chyby kompilátora, ak je x typu void (nedefinovaný).
