我有可以为null的类的属性,在代码中,我要检查值不为null and array-将新值推向它,但是键入Checker仍然认为值可以是无效的。有人可以解释为什么以及如何修复它,谢谢?
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和左脚(,并明确将其添加到if语句 ->一切正常。到底发生了什么?
class BIT {
head: BIT | null = this;
private value: string;
right: BIT | BIT[] | null = null;
left: BIT | BIT[] | null = null; // below you try push: this.left.push(this.value). But your types it's BIT or Array of BIT or null, when 'this.value' is string.
somefunction() {
const haveLeft = this.left !== null;
const leftIsBranch = haveLeft && this.left instanceof Array;
if (haveLeft) {
if (leftIsBranch) {
this.left.push(value); // you forgot to specify 'this': this.left.push(this.value);
}
}
}
}
也代替example: null | BIT
,您可以指定example?: BIT
在打字稿中,所有类型默认情况下都是无效的:
默认情况下,无定义是所有其他类型的子类型。这意味着您可以将null和未定义分配给数字。
但是,当使用
--strictNullChecks
标志时,空和未定义仅可分配给void及其各自类型。这有助于避免许多常见错误。如果您想通过字符串,空或未定义的情况,则可以使用联合类型字符串|null |不明确的。再一次,以后有关联合类型的更多信息
[来自TS Docs]
因此,除非您使用--strictNullChecks
编译器标志,否则不需要添加| null
。
您的类型检查错误的原因可能是您要检查null
而不是undefined
- 这是非初始化字段的默认值。宽松的平等(!=
而不是!==
(检查应有助于识别未定义的情况:
const haveLeft = this.left != null; // This also excludes `undefined`
请注意以下类型检查。
console.log(typeof null); // object
console.log(Array.isArray([])); // true