Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

343
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda