Typescript: Variable non reconnue comme type littéral de chaîne lors de l'utilisation de l'opérateur ternaire

Créé le 3 nov. 2016  ·  1Commentaire  ·  Source: microsoft/TypeScript



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"'.

Question

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 :

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);

>Tous les commentaires

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);
Cette page vous a été utile?
0 / 5 - 0 notes