Quiero reasignar una función anónima para agregar a lo que hace. Básicamente estoy buscando la siguiente funcionalidad.
let f1 = (x: number) => x + 100; // f1 = (x: number) => f1(x) + 20; // becomes recursive -> stack overflow, not what I want f1(3) // 123Las dos opciones que veo son 1. envolver el argumento o 2. de alguna manera envolver el resultado. La primera opción parece más fácil pero no estoy seguro de cómo lograrlo (o si lo que estoy pidiendo es imposible).
Editar: Evidentemente, mi pregunta no fue lo suficientemente clara. He hecho un nuevo ejemplo.
class Cat { eat() { const newCat = createFullCat(this); return newCat; } drink() { const newCat = createQuenchedCat(this); return newCat; } sleep() { const newCat = createRestedCat(this); return newCat; } } function makeCatActionChain(makeCatSleep: boolean, makeCatEat: boolean) { let f1 = (cat: Cat) => cat.drink(); if (makeCatEat) { f1 = (cat: Cat) => f1(cat).eat(); // Need different way to do this } if (makeCatSleep) { f1 = (cat: Cat) => f1(cat).sleep(); // Need different way to do this } return f1; }Si es posible, me gustaría hacer esto sin crear otra variable.
Primero, asignó un valor (una función) a f1 :
let f1 = (x: number) => x + 100; Luego, asignó un nuevo valor (otra función) a f1 :
f1 = (x: number) => f1(x) + 20; Cuando le asignó la nueva función, la función anterior ya no tenía ninguna referencia. En la nueva función, la referencia a f1 se refiere a sí misma (por lo que se repetirá para siempre cuando se la invoque).
Si desea mantener una referencia al primero para que se pueda usar en el segundo, solo asigne al segundo un nombre diferente, como este:
const f1 = (x: number) => x + 100; const f2 = (x: number) => f1(x) + 20; console.log(f2(3)); // 123Si desea aplicar una serie de transformaciones en un número (pero no quiere tener que crear un nombre de variable para cada función de transformación en su programa), puede usar una matriz de funciones para procesar el número en orden, como esta :
type NumberTransform = (n: number) => number; function transformNumber (n: number, transforms: NumberTransform[]): number { let current = n; for (const fn of transforms) current = fn(current); return current; } const transforms: NumberTransform[] = []; transforms.push(n => n + 100); transforms.push(n => n + 20); const result = transformNumber(3, transforms); console.log(result); // 123Creo que lo que necesita son solo dos variables para sus funciones en lugar de reasignar el f1 .
const f1 = (x: number) => x + 100; const f2 = (x: number) => f1(x) + 20; f2(3) // 123Según el ejemplo de código actualizado, ¿es esto algo que logra lo que está hablando?
function makeCatActionChain(makeCatSleep: boolean, makeCatEat: boolean) { if(makeCatSleep) { return (cat: Cat) => cat.drink().sleep(); } if(makeCatEat) { return (cat: Cat) => cat.drink().eat(); } //Assuming you always want the cat to drink return (cat: Cat) => cat.drink(); }