casting - Cómo convertir una variable String a un Tipo Literal de String en Typescript
En Typescript, supongamos que quiero llamar a una función con la siguiente firma-
function foo(param: "TRUE"|"FALSE"|"NONE")
¿Cómo puedo hacer algo como-
var str = runtimeString()
if(str === "TRUE" | str === "FALSE" | str === "NONE")
foo(str)
O, los valores explícitos son la única manera-
var str = runtimeString()
if(str === "TRUE")
foo("TRUE")
else if(str === "FALSE" )
foo("FALSE")
else if(str === "NONE")
foo("NONE")
Respuesta #1
Crea un tipo de literal de cadena como sigue:
type NullableBoolean = "TRUE" | "FALSE" | "NONE";
En la definición de la función, usa este tipo para param:
function foo(param: NullableBoolean)
{
...
}
Asegúrate de convertir la cadena al tipo literal de cadena:
var str = runtimeString();
if(str === "TRUE" || str === "FALSE" || str === "NONE")
foo(<NullableBoolean>str);
Respuesta #2
Si estás seguro de que la cadena en tiempo de ejecución es una de las opciones válidas, puedes simplemente convertir tu cadena al tipo de tu función que espera el tipo literal de cadena.
type Tristate = "TRUE"|"FALSE"|"NONE";
function foo(param: Tristate) {
return "enhanced: " + param;
}
let validInput = "NONE";
foo(validInput as Tristate);
Otra forma de hacer tu conversión es anteponiendo el tipo así:
foo(<Tristate> validInput);
Tenga en cuenta que usted anula la opinión del compilador sobre los datos en su cadena en tiempo de ejecución. Por lo tanto, en tiempo de ejecución existe la posibilidad de que un valor distinto a las tres cadenas definidas llegue a su función foo.
Respuesta #3
La mejor manera que encontré fue crear un guardia de tipo
type NullableBoolean = "TRUE" | "FALSE" | "NONE";
function foo(param: NullableBoolean)
{
...
}
function isNullableBool(str: string): str is NullableBoolean
{
return str === "TRUE" || str === "FALSE" || str === "NONE"
}
if(isNullableBool(str)) { foo(str); }
Esto no es ideal porque tienes que repetir la lista de valores, pero obtienes una mejor encapsulación que con la respuesta de Brett.
