Version TypeScript : 2.0.3 / tous les soirs (2.1.0-dev.201xxxxx)
2.0.3
Code
function test(val: 'AAA'|'BBB'){
//xxx
}
let a = true ? 'AAA' : 'BBB';
test(a);
Comportement attendu:
Compilé avec succès
Comportement réel :
Vous avez une erreur :
Erreur TS2345 : l'argument de type 'string' n'est pas assignable au paramètre de type '"AAA" | "BBB"'.
Cela a été discuté à plusieurs reprises.
Tout d'abord, vous affectez à une variable let, ce qui signifie que le compilateur supposera que vous voudrez peut-être modifier la valeur à l'avenir, par conséquent, il n'affecte pas de type littéral de chaîne à la variable.
De plus, en 2.0, il n'y a jamais eu d'inférence de littéraux. Le développeur devrait le faire explicitement. Donc pour corriger ça :
function test(val: 'AAA'|'BBB'){
//xxx
}
let a: 'AAA' | 'BBB' = true ? 'AAA' : 'BBB';
test(a);
Mais dans TypeScript 2.1, il interprétera les affectations en const
de la manière la plus stricte possible, vous pouvez donc le faire comme ceci :
function test(val: 'AAA'|'BBB'){
//xxx
}
const a = true ? 'AAA' : 'BBB';
test(a);
Commentaire le plus utile
Cela a été discuté à plusieurs reprises.
Tout d'abord, vous affectez à une variable let, ce qui signifie que le compilateur supposera que vous voudrez peut-être modifier la valeur à l'avenir, par conséquent, il n'affecte pas de type littéral de chaîne à la variable.
De plus, en 2.0, il n'y a jamais eu d'inférence de littéraux. Le développeur devrait le faire explicitement. Donc pour corriger ça :
Mais dans TypeScript 2.1, il interprétera les affectations en
const
de la manière la plus stricte possible, vous pouvez donc le faire comme ceci :