检测函数返回“void”(而不是“undefined”)

问题描述 投票:0回答:1

我听到一个谣言说

void
的意思是
null|undefined
。毕竟,这段代码是合法的:

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

但是我遇到了一个违背这种理解的问题。

编辑:当我重新启动 Visual Studio Code 时,问题消失了。事实证明,只有当

strictNullChecks
off时才会出现下面描述的问题。我使用
"strictNullChecks": true
,所以我猜想 IDE 暂时感到困惑,令人惊讶的是,新的错误可能是由不太严格的模式引起的。我应该提到,在
strictNullChecks
模式下,
var y: void = null
是一个错误。这给我留下了一个问题:严格模式下
void
undefined
之间有什么区别?

我想为数据结构定义一个回调,该数据结构可以返回一个值,但不必。具体来说,您可以返回

{stop:true}
来停止迭代。我的代码是这样开始的,如果函数没有返回值,它就不起作用:

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

如果我使用,错误消息(本身似乎不正确)就会消失

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

但是如果我使用它就会回来

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

但是,如果我使用

{stop?:boolean} | void
,如何检查函数是否返回
void
?通常的基于控制流的打字在这里不起作用:

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

我倾向于认为这要么是编译器错误,要么是考虑不周的设计决策,但是我缺少一些简单的修复方法吗?

tsc --version:2.9.2(除非 IntelliSense 版本不同)

typescript void
1个回答
7
投票

[原答案]

这种形式的

if
测试可以避免错误:

if (result instanceof Object) {

[更好的答案]

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

如果

x
的类型为
void
(未定义),则此代码不会生成编译器错误。

© www.soinside.com 2019 - 2024. All rights reserved.