如何通过NULL TS类型检查解决问题



我有可以为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

相关内容

  • 没有找到相关文章

最新更新