Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

155
Vistas
Obtenga Typescript para inferir un tipo de unión

Estoy tratando de crear una firma de función relativamente simple como la siguiente:

 function<U>(...args:U[]):U {/* body */}

Quiero que TypeScript combine los tipos de argumentos pasados a una unión en lugar de simplemente inferir U como el tipo del primer argumento. Por favor, ¿cómo voy a hacer esto?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

El problema que tienes es que el siguiente código produce un error de compilación:

 function f<U>(...args: U[]): U { return args[Math.floor(Math.random() * args.length)] } const a = f("string", 123, true); // error! // ~~~ <-- error! 123 is not a string // U inferred as string // const a: string

Las heurísticas del compilador evitan inferir una unión aquí porque a menudo la gente quiere que ocurra ese error. Consulte ¿Por qué el argumento de tipo no se infiere como un tipo de unión? para más información.

Hay una solicitud de función abierta en microsoft/TypeScript#44312 que solicita alguna forma de decirle al compilador que desea una unión en lugar de un error. Por ahora esto no es posible, por lo que si desea un comportamiento similar, debe utilizar soluciones alternativas.

Una solución común es cambiar la función para que sea genérica no en el tipo U de los elementos de args , sino en el tipo de matriz T de args en sí . A partir de ahí, puede indexar ese tipo con number para obtener el tipo de elemento. Es decir, si T es un tipo tipo matriz, entonces T[number] es el tipo de elemento (ya que ese es el tipo que obtienes cuando indexas la matriz con un number ):

 function f<T extends any[]>(...args: T): T[number] { return args[Math.floor(Math.random() * args.length)] } const a = f("string", 123, true); // T inferred as [string, number, boolean] // const a: string | number | boolean

Ahora no hay ningún error, y el tipo de a es la unión que querías.

Enlace del patio de recreo al código

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda