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

时间:2018-06-21 01:30:20

标签: typescript void

我听说谣言void的意思是null|undefined。毕竟,此代码是合法的:

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

但是我遇到了一个问题,不符合这种理解。

编辑:当我重新启动Visual Studio Code时,问题消失了。事实证明,仅当strictNullChecks off 时,才会出现下述问题。我使用"strictNullChecks": true,所以我想暂时会使IDE感到困惑,而且令人惊讶的是,新的错误可能是由不太严格的模式引起的。我应该提到在strictNullChecks模式下,var y: void = null是一个错误。这只给我一个问题:严格模式下voidundefined有什么区别?

我想为可以返回值的数据结构定义一个回调,但不必。具体来说,您可以返回{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?通常的control-flow-based typing在这里不起作用:

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版本不同)

1 个答案:

答案 0 :(得分:1)

if测试的这种形式可以避免错误:

if (result instanceof Object) {