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

342
Vistas
¿Cómo pasar un tipo de clase como parámetro?

Como se describe aquí: declarar el tipo de clase con TypeScript (pasar la clase como parámetro) puedo pasar un tipo de clase como parámetro.

Hay un problema:

 export namespace customCommand { export class Command { public constructor(parameter?: any) { } } export function register(command: typeof Command) { new command() } }

cuando hago esto

 customCommand.register(Map)

o

 customCommand.register(Object)

No hay errores. Sé que typeof Command y typeof Map devuelven el mismo resultado.

Pero, ¿cómo puedo proteger esto y pasar solo el tipo Command ?

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

0

En TypeScript, puede construir un nuevo tipo, algo como:

 type Class<T> = new (...args: any[]) => T

Que luego puedes usar de esta manera:

 function register(command: Class<Command>) { new command() }

Esto debería restringir a TypeScript para que SOLAMENTE acepte clases que construyan o amplíen el tipo de Comando.

EDITAR:

Lo siento, me perdí algo cuando evalué tu ejemplo. Su class Command es lo suficientemente genérico como para que casi cualquier objeto construible se superponga. Lo que le falta son restricciones.

  1. El constructor tomará any primer argumento, indefinido o no, por lo que cualquier clase que tenga un constructor que acepte cero o un argumento coincidirá
  2. La firma del objeto que se devolverá está vacía, no existen métodos o propiedades para identificarlo, por lo que cualquier método/accesorio "fallará" y se permitirá como una "extensión" de su clase.

Podemos superar cualquiera de estos modificando las propiedades o los métodos necesarios para la clase Command , restringiendo así los tipos derivados a esa firma explícita.

Si queremos reducir las posibles coincidencias agregando un método o una propiedad específica de Command , obtendremos el comportamiento deseado que ha descrito.

 export namespace customCommand { export type Class<T> = new (...args: any[]) => T export class Command { public constructor(parameter?: any) { } picard (): string { return 'Make it so.' } } export function register(command: Class<Command>) { new command() } } /* Argument of type 'MapConstructor' is not assignable to parameter of type 'Class<Command>'. Property 'picard' is missing in type 'Map<any, any>' but required in type 'Command'. ts(2345) */ customCommand.register(Map) /* Argument of type 'ObjectConstructor' is not assignable to parameter of type 'Class<Command>'. The 'Object' type is assignable to very few other types. Did you mean to use the 'any' type instead? Property 'picard' is missing in type 'Object' but required in type 'Command'. ts(2345) */ customCommand.register(Object) /* No error */ customCommand.register(customCommand.Command)
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