簡體   English   中英

Typescript類方法可以在不返回“ this”的情況下允許方法鏈接嗎?

[英]Typescript can class methods allow method chaining without returning 'this'?

我制作了一個Mycalculator類,該類實現了以下計算器接口以實現方法鏈接。

interface Calculator {
  add(a: number): void
  sub(a: number): void
  div(a: number): void
  mul(a: number): void
  display(decimalToDisplay: number): void
  allClear(): void
  reset(value: number): void
}


class MyCalculator implements Calculator {
  private _current: number;

  constructor(public value: number) {
    this._current = value
  }

  add(a: number): MyCalculator {
    this.current += a
    return this
  }
  sub(a: number): MyCalculator {
    this.current -= a
    return this
  }
  div(a: number): MyCalculator {
    this.current /= a
    return this
  }
  mul(a: number): MyCalculator {
    this.current *= a
    return this
  }

  get current (): number {
    return this._current
  }

  set current (result: number)  {
    this._current = result
  }

  reset (value: number) {
    this.current = value
    return this
  }

  display(decimalToDisplay: number = 2): MyCalculator {
    console.log(this.current.toFixed(decimalToDisplay))
    return this
  }

  allClear(): MyCalculator {
    this.current = 0
    return this
  }

}

// Test
new MyCalculator(3).add(5).mul(5).div(3).div(3).display() // 4.44
new MyCalculator(5).add(5).mul(5).div(5).display().allClear().reset(5).add(5).display() // 10.00, 10.00

在上面的代碼中,我有一些問題

  • 每個方法都可以允許方法鏈接而不return this方法嗎?
  • 如果不是,您能告訴我什么是正確的指導方法嗎?
  • 如果沒有,如何在接口中聲明add,sub,div和mul方法以返回Mycalculator類型?

謝謝你的幫助!

你做對了。 返回此方法是實現方法鏈接的正常方法。 但是有一些問題。 方法應為接口類型。

interface Calculator {
  add(a: number): Calculator
  sub(a: number): Calculator
  div(a: number): Calculator
  mul(a: number): Calculator
  display(decimalToDisplay: number): void
  allClear(): void
  reset(value: number): void
}

即使在實現此接口時,結果類型也是Calculator。 您想要的就是多態性。 該方法的調用者只需要一些計算器作為結果,獲取哪種實現並不重要。 因此,這種方法的一個示例如下所示:

class MyCalculator implements Calculator {
// ...
  add(a: number): Calculator {
    this.current += a
    return this
  }
// ....
}

但請注意,您的計算器無法正常工作。 1 + 2 * 3與1 +(2 * 3)相同,但是您的計算器會將其視為(1 + 2)*3。也許您不希望這種行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM