【问题标题】:Typescript can class methods allow method chaining without returning 'this'?打字稿可以类方法允许方法链接而不返回'this'吗?
【发布时间】:2018-04-01 15:57:59
【问题描述】:

我创建了一个 Mycalculator 类,该类实现了以下 Calculator Interface 作为方法链接。

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类型?

感谢您的帮助!

【问题讨论】:

  • 您可以在接口中使用“this”作为返回类型。
  • 除了return this,您还可以return 一个新实例。
  • @Vayrax 它有效!谢谢
  • 你可以考虑让你的方法和_current变量static。这样,您不必创建 new MyCalculator() 实例来调用方法。

标签: javascript typescript oop method-chaining


【解决方案1】:

你做对了。返回 this 是实现方法链接的正常方式。但也有一些问题。方法应该是接口类型。

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
}

即使在您实现此接口时,结果类型也是计算器。你想要的叫做多态性。方法的调用者只想要一些计算器作为结果,他得到什么样的实现并不重要。因此,这种方法的一个示例如下所示:

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

但请注意,您的计算器无法正常工作。 1 + 2 * 3 与 1 + (2 * 3) 相同,但您的计算器会将其视为 (1 + 2) * 3。也许您不希望这种行为。

【讨论】:

  • 感谢您对我的问题的回复,即使我没有问。我需要对其进行修改,以便可以按照通常的算术顺序进行计算。
猜你喜欢
  • 2013-04-15
  • 2015-07-17
  • 2021-06-09
  • 2018-07-21
  • 2021-05-07
  • 2016-05-15
  • 2017-08-25
  • 1970-01-01
相关资源
最近更新 更多