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" '.
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);
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:
Mas no TypeScript 2.1 ele interpretará atribuições a
const
da maneira mais estrita possível, então você poderia fazer assim: