打字稿可以 class 方法允许方法链接而不返回 'this' 吗?
Typescript can class methods allow method chaining without returning 'this'?
我制作了一个 Mycalculator class,它实现了以下 计算器接口 作为方法链接。
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
的情况下允许方法链接吗?
- 如果没有,你能告诉我改变方法的正确方法是什么吗?
- 如果没有,我如何在 return Mycalculator 类型的接口中声明 add、sub、div 和 mul 方法?
感谢您的帮助!
你做对了。返回 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。也许您不希望出现这种情况。
我制作了一个 Mycalculator class,它实现了以下 计算器接口 作为方法链接。
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
的情况下允许方法链接吗? - 如果没有,你能告诉我改变方法的正确方法是什么吗?
- 如果没有,我如何在 return Mycalculator 类型的接口中声明 add、sub、div 和 mul 方法?
感谢您的帮助!
你做对了。返回 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。也许您不希望出现这种情况。