Traté de asignar clases a cadenas. Algo como:
map.add(ClassName, 'my string');
para esto creé un tipo personalizado:
type NoConstructor<T> = Pick<T, keyof T>;
entonces defino un mapa como este:
const map: Map<NoConstructor<typeof Device>, string> = new Map();
while map.add(ClassName, 'my string'); funciona, map.get(instanceOfClassName.constructor) solo funciona mientras una clase no tenga métodos estáticos. Tan pronto como una clase tiene métodos estáticos, TypeScript me da un error:
El argumento de tipo 'Función' no se puede asignar al parámetro de tipo 'NoConstructor'. Al tipo 'Función' le faltan las siguientes propiedades del tipo 'NoConstructor': getInputs, getOutputs
¿Por qué los métodos estáticos en la clase influyen en mi tipo personalizado? Para mí esto no tiene sentido. ¿Alguien puede explicar por qué este es el caso y cómo solucionar este ejemplo de código?
Ejemplo en typescriptlang.org/play :
export abstract class Device { public getStatus(): string { return 'foo'; } // Remove this one public static getInputs(): {[key: string]: number} { return {}; } // and remove this one, and the code works public static getOutputs(): {[key: string]: number} { return {}; } } class DeviceA extends Device { } type NoConstructor<T> = Pick<T, keyof T>; export default class DeviceUpdater { private readonly map: Map<NoConstructor<typeof Device>, string> = new Map(); public add(deviceType: NoConstructor<typeof Device>, updater: string) { this.map.set(deviceType, updater); } public update(device: Device): void { const result = this.map.get(device.constructor); if (result === undefined) { throw new Error(`Cannot update device of type '${device.constructor.name}': no updater found`); } console.log(result); } } const deviceUpdater = new DeviceUpdater(); deviceUpdater.add(DeviceA, 'something'); deviceUpdater.update(new DeviceA());