Typescript: Variável não reconhecida como tipo literal de string ao usar o operador ternário

Criado em 3 nov. 2016  ·  1Comentário  ·  Fonte: microsoft/TypeScript



Versão do TypeScript: 2.0.3 / nightly (2.1.0-dev.201xxxxx)
2.0.3

Código

function test(val: 'AAA'|'BBB'){
  //xxx
}

let a = true ? 'AAA' : 'BBB';
test(a);

Comportamento esperado:
Compilado com sucesso

Comportamento real:
Erro obtido:

Erro TS2345: O argumento do tipo 'string' não pode ser atribuído ao parâmetro do tipo '"AAA" | "BBB" '.

Question

Comentários muito úteis

Isso foi discutido várias vezes.

Primeiro, você está atribuindo a uma variável let, o que significa que o compilador assumirá que você pode querer alterar o valor no futuro, portanto, ele não atribui um tipo de literal de string à variável.

Além disso, no 2.0, nunca houve uma inferência de literais. O desenvolvedor teria que fazer isso explicitamente. Então, para consertar isso:

function test(val: 'AAA'|'BBB'){
  //xxx
}

let a: 'AAA' | 'BBB' = true ? 'AAA' : 'BBB';
test(a);

Mas no TypeScript 2.1 ele interpretará atribuições a const da maneira mais estrita possível, então você poderia fazer assim:

function test(val: 'AAA'|'BBB'){
  //xxx
}

const a = true ? 'AAA' : 'BBB';
test(a);

>Todos os comentários

Isso foi discutido várias vezes.

Primeiro, você está atribuindo a uma variável let, o que significa que o compilador assumirá que você pode querer alterar o valor no futuro, portanto, ele não atribui um tipo de literal de string à variável.

Além disso, no 2.0, nunca houve uma inferência de literais. O desenvolvedor teria que fazer isso explicitamente. Então, para consertar isso:

function test(val: 'AAA'|'BBB'){
  //xxx
}

let a: 'AAA' | 'BBB' = true ? 'AAA' : 'BBB';
test(a);

Mas no TypeScript 2.1 ele interpretará atribuições a const da maneira mais estrita possível, então você poderia fazer assim:

function test(val: 'AAA'|'BBB'){
  //xxx
}

const a = true ? 'AAA' : 'BBB';
test(a);
Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

bgrieder picture bgrieder  ·  3Comentários

fwanicka picture fwanicka  ·  3Comentários

jbondc picture jbondc  ·  3Comentários

manekinekko picture manekinekko  ·  3Comentários

Roam-Cooper picture Roam-Cooper  ·  3Comentários