我听到一个谣言说
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 版本不同)
[原答案]
这种形式的
if
测试可以避免错误:
if (result instanceof Object) {
[更好的答案]
if (x !== null && typeof x === 'object') {
如果
x
的类型为 void
(未定义),则此代码不会生成编译器错误。