2016-07-14 1 views
1

Disons que j'ai le code comme ceci:Tapuscrit strictNullChecks et fermetures

function f(x: string | undefined) { 
    if (x) { 
     console.log(x); 
     Promise.resolve() 
      .then(() => g(x)) // error, x is string | undefined 
    } 

    // x = undefined; 
} 

function g(y: string) { 
} 

Les if (x) agit comme un garde de type, si x est de type string au console.log. Mais lorsqu'il est référencé à partir de la fermeture dans le .then, son type est string | undefined. Cela doit être dû au fait que la valeur peut revenir à indéfini en dehors de la garde de type, avant que le code .then s'exécute. Mais s'il n'est pas à nouveau défini, Typescript ne doit pas faire le genre d'analyse qui lui permettrait de le détecter. Je peux contourner le problème en utilisant l'opérateur ! sur x. Mais je trouve que je fais souvent ce genre de chose dans mon code de base, et cela ne me protège pas d'être cassé plus tard en rendant x indéfini.

Existe-t-il un autre moyen de contourner ce problème? Est-ce que je comprends le problème correctement?

Répondre

3

Je pense que vous pouvez faire l'un de ces:

(1) Utilisation const:

function f(x: string | undefined) { 
    if (x) { 
     const x2 = x; 
     Promise.resolve().then(() => g(x2)); 
    } else { 
     // x = undefined; 
    } 
} 

(2) Appel g() avant la promesse:

function f(x: string | undefined) { 
    if (x) { 
     let y = g(x); 
     Promise.resolve().then(() => y); 
    } else { 
     // x = undefined; 
    } 
} 
+0

1 - Bon point, en fait ce n'est pas que vous avez une référence const, c'est que vous avez une nouvelle référence qui est seulement de type 'string'. Donc 'let' et' var' fonctionnent aussi. Cela mènerait à un encombrement cependant. 2 - C'est vrai, mais d'habitude, je ne peux pas faire ça dans les scénarios auxquels je pense. Sinon, je le ferais déjà :) –

+0

Ouais, je suppose que vous avez raison sur la partie const, j'ai commencé à essayer de le mettre dans le paramètre de la fonction, mais ce n'est pas autorisé, donc je l'ai copié dans le corps de la fonction /laisser. –