链式调用大家一定不陌生,比如在jQuery中有广泛应用。
通过使方法返回当前对象 (也就是this) 就能够创建链式调用功能。
看如下代码实例:export default class BasicCalculator {
public constructor(protected value: number = 0) { }
public currentValue(): number {
return this.value;
}
public add(operand: number) {
this.value += operand;
return this;
}
public subtract(operand: number) {
this.value -= operand;
return this;
}
public multiply(operand: number) {
this.value *= operand;
return this;
}
public divide(operand: number) {
this.value /= operand;
return this;
}
}
然后引入此模块,通过链式调用实现相关计算功能:import calc from "./BasicCalculator";
let v = new calc(2)
.multiply(5)
.add(1)
.currentValue();
通过链式方式连续不断的调用相关方法,实现方式就是各个方法返回this(也就是对象本身)。
下面再来看一段代码实例:import BasicCalculator from "./BasicCalculator";
export default class ScientificCalculator extends BasicCalculator {
public constructor(value = 0) {
super(value);
}
public square() {
this.value = this.value ** 2;
return this;
}
public sin() {
this.value = Math.sin(this.value);
return this;
}
}
ScientificCalculator继承BasicCalculator类。
在之前,BasicCalculator的方法返回this, 返回值类型被推断为BasicCalculator,如果在ScientificCalculator的实例上调用属于 BasicCalculator的方法,将会报错。
代码如下:import calc from "./ScientificCalculator";
let v = new calc(0.5)
.square()
.divide(2)// 返回值类将被推断为BasicCalculator
.sin() // 将会报错,因为BasicCalculator类不具有此方法
.currentValue();
在之前,代码将会报错,TypeScript1.7增加了this类型,那么divide()返回值类型将会被推断为this类型。
前面其实展现了this类型的多态,不但可以是父类类型,也可以是子类类型,也可以是实现的接口类型。
this 类型在描述一些使用了 mixin 风格继承的库 (比如 Ember.js) 的交叉类型:interface MyType {
extend(other: T): this & T;
}