Búsqueda de sitios web

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:

  1. Sobrescribe toString y usa coerción de cadena para obtener la representación en cadena del objeto
  2. Requiere que se llame a un método terminador antes de la visualización (es decir, no olvides llamar a toString cuando termines la cadena)
  3. Sobrescribe valueOf y 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

Artículos relacionados