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 ?
En TypeScript, puede construir un nuevo tipo, algo como:
type Class<T> = new (...args: any[]) => TQue 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.
any primer argumento, indefinido o no, por lo que cualquier clase que tenga un constructor que acepte cero o un argumento coincidirá 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)