javascript - ¿Cómo hacer encadenamiento de funciones en typescript?
Quiero usar encadenamiento de funciones en typescript.
Considera una clase
export class numbOp(){
private n;
constructor(int num){
this.n = num;
}
public add(inc = 1){
this.n = this.n + inc;
}
}
¿Cómo lo uso como (1)?
let finalNumber = new numbOp(3);
console.log(finalNumber) // Output: 3
¿Cómo lo uso como (2)?
let finalNumber = new numbOp(3).add();
console.log(finalNumber) // Output: 4
¿Cómo lo uso como (3)?
let finalNumber = new numbOp(3).add().add();
console.log(finalNumber) // Output: 5
¿Cómo lo uso como (4)?
let finalNumber = new numbOp(3).add().add(2).toString();
console.log(finalNumber) // Output: "6"
Por favor, ayúdame a lograr esto. Gracias de antemano :)
Respuesta #1
Solo necesitas devolver this de las funciones que quieres encadenar
class numbOp {
private n: number;
constructor(num: number) {
this.n = num;
}
public add(inc = 1) : this { // annotation not necessary added to address comments
this.n = this.n + inc;
return this;
}
toString() {
return this.n;
}
}
let finalNumber = new numbOp(3);
console.log(finalNumber + "") // Output: 3
//How do I use it as (2)
let finalNumber2 = new numbOp(3).add();
console.log(finalNumber2 + "") // Output: 4
//How do I use it as (3)
let finalNumber3 = new numbOp(3).add().add();
console.log(finalNumber3 + "") // Output: 5
//How do I use it as (4)
let finalNumber4 = new numbOp(3).add().add(2).toString();
console.log(finalNumber4) // Output: "6"
Editar
Dado que la parte de console.log parece haberse vuelto más interesante que la parte de la cadena en los comentarios, agregaré las formas de asegurar que la salida en la consola sea un número:
- Sobrescribe
toStringy usa coerción de cadena para obtener la representación en cadena del objeto - Requiere que se llame a un método terminador antes de la visualización (es decir, no olvides llamar a
toStringcuando termines la cadena) - Sobrescribe
valueOfy usa el operador unario+(esto también hará que tu clase sea usable en operaciones binarias)
Código para la última opción:
class numbOp {
private n: number;
constructor(num: number) {
this.n = num;
}
public add(inc = 1) : this { // annotation not necessary added to address comments
this.n = this.n + inc;
return this;
}
valueOf() {
return this.n;
}
}
let finalNumber2 = new numbOp(3).add();
console.log(+finalNumber2) // Output: 4
console.log(1 + (+finalNumber2)) // Output: 5
console.log(1+(finalNumber2 as any as number)) // Output: 5
