web-dev-qa-db-fra.com

Typographie "erreur TS2532: l'objet est peut-être" non défini "" même après une vérification non définie

J'essaie d'utiliser l'option --strict Sur tsc mais je suis tombé sur le cas "bizarre" suivant que je ne semble pas comprendre.

Si j'écris:

function testStrict(input: {query?: {[prop: string]: string}}) {
  if (input.query) {
    Object.keys(input.query).forEach(key => {
      input.query[key];
    })
  }
  return input;
}

le compilateur se plaint de:

test.ts (5,9): erreur TS2532: l'objet est peut-être "non défini".

(la ligne incriminée est input.query[key];)

Ce que je ne comprends pas, c'est que j'ai déjà vérifié non défini avec le garde if sur la première ligne de la fonction if (input.query), donc pourquoi le compilateur pense-t-il que cela pourrait être indéfini?

J'ai corrigé cela en ajoutant un autre garde identique avant l'accès à l'objet, comme:

function testStrict(input: {query?: {[prop: string]: string}}) {
  if (input.query) {
    Object.keys(input.query).forEach(key => {
      if (input.query) {
        input.query[key];
      }
    })
  }
  return input;
}

mais je ne comprends pas pourquoi une autre ligne identique serait nécessaire.

14
Martin Sileno

Parce que le deuxième accès à input.query se produit dans une autre fonction, la fonction flèche est passée à forEach. L'analyse de flux ne franchit pas les limites des fonctions, donc comme vous êtes dans une autre fonction, vous devez tester à nouveau.

Une alternative au double test serait d'utiliser une variable locale, car le type de la variable est verrouillé lors de l'affectation et il n'inclura pas le type undefined:

function testStrict(input: { query?: { [prop: string]: string } }) {
    if (input.query) {
        const query = input.query;
        Object.keys(input.query).forEach(key => {
            query[key];
        })
    }
    return input;
}