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.
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;
}