He estado tratando de crear una función donde el parámetro de la función es una unión hecha de otras dos uniones. Lo quiero para que, dependiendo de la cadena pasada al parámetro, se active una función diferente en consecuencia. Algo como esto:
type Type1 = "a" | "b" | "c"; type Type2 = "x" | "y" | "z"; function doSomething(param: Type1 | Type2) { // if param is a part of the "Type1" union functionForTypeOne(); } doSomething("z");Busqué a través de Internet y los documentos y no pude encontrar una manera de hacer esta verificación de tipo de tiempo de ejecución. Encontré algunas "soluciones" para la verificación de tipos, pero todas fueron escritas para tipos de objetos, no para cadenas y uniones.
En javascript básico, podría crear una matriz const y verificar si la cadena se encuentra dentro de la matriz, así:
const type1 = ["a", "b", "c"]; const type2 = ["x", "y", "z"]; function doSomething(param) { if (type1.includes(param)) functionForTypeOne(); }Hacer esto en TypeScript es una especie de solución, pero como necesito crear uniones a partir de estas constantes, se siente muy ineficiente y no me permite usar las funciones de verificación de tipos del lenguaje. Tenía curiosidad por saber si alguien tiene una solución para esto que posiblemente haya pasado por alto, o si esta es la única forma de solucionar mi problema.
Puede construir las uniones a partir de sus tuplas casi automáticamente y usar un predicado de protección de tipos para recuperar la seguridad de tipos:
const type1 = ["a", "b", "c"] as const; // Assert as const to infer tuple instead of array string[] const type2 = ["x", "y", "z"] as const; // Automatically get union type from tuple values type Type1 = typeof type1[number]; // ^? "a" | "b" | "c" type Type2 = typeof type2[number]; // ^? "x" | "y" | "z" // Type guard predicate function isIn<T extends readonly string[]>(val: string, arr: T): val is T[number] { return arr.includes(val); } function doSomething(param: Type1 | Type2) { param //^? "a" | "b" | "c" | "x" | "y" | "z" if (isIn(param, type1)) { param //^? "a" | "b" | "c" //functionForTypeOne(); } }