Versión de 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);
Comportamiento esperado:
Compilado exitosamente
Comportamiento real:
Error obtenido:
Error TS2345: El argumento de tipo 'cadena' no se puede asignar al parámetro de tipo '"AAA" | "BBB" '.
Esto se ha discutido varias veces.
Primero, está asignando a una variable let, lo que significa que el compilador asumirá que es posible que desee cambiar el valor en el futuro, por lo tanto, no asigna un tipo literal de cadena a la variable.
Además, en 2.0, nunca hubo una inferencia de literales. El desarrollador tendría que hacerlo explícitamente. Entonces, para arreglar esto:
function test(val: 'AAA'|'BBB'){
//xxx
}
let a: 'AAA' | 'BBB' = true ? 'AAA' : 'BBB';
test(a);
Pero en TypeScript 2.1 interpretará las asignaciones a const
de la manera más estricta posible, por lo que podría hacerlo así:
function test(val: 'AAA'|'BBB'){
//xxx
}
const a = true ? 'AAA' : 'BBB';
test(a);
Comentario más útil
Esto se ha discutido varias veces.
Primero, está asignando a una variable let, lo que significa que el compilador asumirá que es posible que desee cambiar el valor en el futuro, por lo tanto, no asigna un tipo literal de cadena a la variable.
Además, en 2.0, nunca hubo una inferencia de literales. El desarrollador tendría que hacerlo explícitamente. Entonces, para arreglar esto:
Pero en TypeScript 2.1 interpretará las asignaciones a
const
de la manera más estricta posible, por lo que podría hacerlo así: