我听说谣言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
?通常的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版本不同)
答案 0 :(得分:1)
if
测试的这种形式可以避免错误:
if (result instanceof Object) {