Как сделать цепочку функций машинописи? - PullRequest
0 голосов
/ 30 декабря 2018

Я хочу использовать цепочку функций в машинопись .

Рассмотрим класс

export class numbOp(){
  private n;
  constructor(int num){
    this.n = num;
  }

  public add(inc = 1){
    this.n = this.n + inc;
  }

}

Как мне его использоватькак (1)

let finalNumber = new numbOp(3);
console.log(finalNumber) // Output: 3

Как использовать его как (2)

let finalNumber = new numbOp(3).add();
console.log(finalNumber) // Output: 4

Как использовать его как (3)

let finalNumber = new numbOp(3).add().add();
console.log(finalNumber) // Output: 5

Как использовать его как (4)

let finalNumber = new numbOp(3).add().add(2).toString();
console.log(finalNumber) // Output: "6"

Пожалуйста, помогите мне добиться этого.Заранее спасибо:)

1 Ответ

0 голосов
/ 30 декабря 2018

Вам просто нужно вернуть this из функций, которые вы хотите связать

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"

Редактировать

Поскольку часть console.log, кажется, сталаболее интересной, чем часть цепочки в комментариях, я добавлю способы обеспечить вывод в консоли числа:

  1. Переопределить toString и использовать приведение строки для получения строкового представленияобъект
  2. Требовать вызова метода терминатора перед отображением (т.е. не забывать вызывать toString после завершения цепочки)
  3. Переопределить valueOf и использовать унарный + оператор (это также сделает ваш класс пригодным для использования в бинарных операциях

Код для последней опции:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...