Tengo una clase que toma como parámetro una función que se ajusta a una interfaz. La clase luego llama a esta función con una entrada dada.
En la interfaz siempre se requiere una entrada, pero también se permiten otros parámetros, aunque son opcionales. Quiero proporcionar estos parámetros adicionales al crear una instancia. ¿Cómo debo hacer esto?
Consideré agregar un parámetro args en el constructor que se aplicará a la llamada de función, pero esto parece feo y separa los parámetros de la función. También consideré crear una función intermedia que toma el único parámetro input y lo pasa a la función con args , pero nuevamente esto parece complicado: me gustaría encapsular todo dentro de la clase y proporcionar toda la configuración de la instancia resultante cuando sea construido.
interface IThingAction { (input: string, ...args: any[]): boolean; } let printInput: IThingAction = (input: string) => { console.log(input); } let repeatInput: IThingAction = (input: string, iterations: number) => { for (var i = 0; i < iterations, i++) { console.log(input); } } class Thing { action: IThingAction; constructor(action: IThingAction) { this.action = action; } doAction(input: string): boolean { return this.action(input); } } let speaker = new Thing(printInput); let echoer = new Thing(repeatInput); // I'd like to provide extra parameters here, eg (3) speaker.doAction('hello'); // hello echoer.doAction('-o'); // -o // -o // -oUna de las soluciones es cambiar el repeatInput se convierte en un creador de funciones como se muestra a continuación:
type IThingAction = (input: string) => boolean; const makeRepeatInput = (iterations: number): IThingAction => (input) => { for (var i = 0; i < iterations; i++) { console.log(input); } } let echoer = new Thing(makeRepeatInput(3));