Javascript 如何解决空ts类型检查的问题?
我有一个类的属性可以为null,在代码中我检查值是否为非null,是否为数组-将新值推送到它,但类型检查器仍然认为该值可以为null。有人能解释一下为什么以及如何修复它吗,谢谢Javascript 如何解决空ts类型检查的问题?,javascript,typescript,types,null,Javascript,Typescript,Types,Null,我有一个类的属性可以为null,在代码中我检查值是否为非null,是否为数组-将新值推送到它,但类型检查器仍然认为该值可以为null。有人能解释一下为什么以及如何修复它吗,谢谢 class BIT { head: BIT | null = this; private value: string; right: BIT | BIT[] | null = null; left: BIT | BIT[] | null = null; somefunction(node: BIT)
class BIT {
head: BIT | null = this;
private value: string;
right: BIT | BIT[] | null = null;
left: BIT | BIT[] | null = null;
somefunction(node: BIT) {
const haveLeft = this.left !== null;
const leftIsBranch = haveLeft && this.left instanceof Array;
if (haveLeft) {
if (leftIsBranch) {
this.left.push(node);
}
}
}
}
UPD:如果我去掉了布尔变量haveLeft和leftIsBranch,并显式地将其添加到if语句->一切正常。到底发生了什么事?注意下面的类型检查
console.log(typeof null);//对象
console.log(Array.isArray([]);//正确
也可以在TypeScript中指定
示例:null | BIT
而不是示例:BIT,默认情况下,所有类型都可以为null:
默认情况下,null和undefined是所有其他类型的子类型。这意味着您可以将null和undefined赋值给类似number的对象
但是,当使用--stricnullchecks
标志时,null和undefined仅可分配给void及其各自的类型。这有助于避免许多常见错误。如果要传入字符串或null或undefined,可以使用union类型字符串| null | undefined。下面再次介绍有关联合类型的更多信息
[来自TS]
因此,除非您使用的是--stricnullchecks
编译器标志,否则没有必要添加|null
类型检查错误的原因可能是您正在检查null
,而不是undefined
——这是未初始化字段的默认值。松散相等(!=
而不是!=
)检查也有助于识别未定义的情况:
const haveLeft = this.left != null; // This also excludes `undefined`
看起来问题是关于类型脚本语法,而不是js中的检查类型。对不起,我误解了。您能粘贴类型检查错误吗?[ts](在我的语言中表示:可能,对象为空的错误)(属性)示例。左:示例[]空
const haveLeft = this.left != null; // This also excludes `undefined`