1
votes

Comment résoudre le problème de la vérification de type NULL TS?

J'ai une propriété de classe qui peut être nulle et dans le code, je vérifie si la valeur n'est pas nulle et est un tableau - poussez une nouvelle valeur dessus, mais le vérificateur de type pense toujours que la valeur peut être nulle. Quelqu'un peut-il expliquer pourquoi et comment le réparer, merci?

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: si je me débarrasse des variables booléennes haveLeft et leftIsBranch et que je les ajoute explicitement à l'instruction if -> tout fonctionne très bien. Que diable se passe-t-il?


2 commentaires

Pourriez-vous coller l'erreur de vérification de type?


[ts] (erreur dans ma langue disant: Peut-être, l'objet est nul) (propriété) Example.left: Exemple [] | nul


3 Réponses :


0
votes

Notez la vérification de type suivante.

console.log(typeof null); // object
console.log(Array.isArray([])); // true


1 commentaires

Il semble que la question portait sur la syntaxe du script de type et non sur le type de vérification dans js. Désolé j'ai mal compris.



1
votes
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);
      }
    }
  }
}

Also instead of example: null | BIT you can specify example?: BIT

0 commentaires

1
votes

Dans TypeScript, tous les types sont nullables par défaut:

Par défaut, nul et non défini sont des sous-types de tous les autres types. Cela signifie que vous pouvez attribuer null et indéfini à quelque chose comme nombre.

Cependant, lors de l'utilisation de l'indicateur --strictNullChecks , null et undefined ne sont assignables qu'à void et à leurs types respectifs. Cela permet d'éviter de nombreuses erreurs courantes. Dans les cas où vous souhaitez transmettre une chaîne ou une valeur nulle ou non définie, vous pouvez utiliser la chaîne de type union | null | indéfini. Encore une fois, plus d'informations sur les types d'union plus tard.

[De TS docs ]

Donc, à moins que vous n'utilisiez l'indicateur de compilateur --strictNullChecks , ajoutez | null n'est pas nécessaire.

La cause de votre erreur de vérification de type est probablement que vous comparez null mais pas undefined - qui est la valeur par défaut des champs non initialisés. Une vérification d'égalité lâche (! = au lieu de ! == ) devrait aider à identifier également les cas non définis:

const haveLeft = this.left != null; // This also excludes `undefined`


0 commentaires