class Pump<T> {
constructor(public value: T){
}
pipe(...operators:(()=>any)[]): this{
return operators.reduce((result, operator) => operator.call(result), this);
}
}
function setNumber(value: number){
return function(){
this.value = value;
return this as any as Pump<number>;
};
}
function setString(value: string){
return function(){
this.value = value;
return this as any as Pump<string>;
};
}
const pump = new Pump<{}>({});
// want to infer number type
pump.pipe(setNumber(1)).value;
pump.pipe(setString('2'), setNumber(1)).value;
// want to infer string type
pump.pipe(setString('1')).value;
pump.pipe(setNUmber(2), setString('1')).value;
如果运算符不多,我可以对结果进行硬编码。 我已经尝试过用3个运算符来实现此目的。 它工作正常,但是如果添加新的运算符,它将增加类型和重载 我只为3个运算符定义了11个重载
不想为管道使用泛型。 与运算符相同数量的泛型似乎并不有趣。
我想尽可能地从运算符推断类型。
运算符可以更改Pump的T或返回另一个构造函数。 如果需要用于推断类型或更改类型的管道,操作员可以调用管道的方法。
我的解释可能不足以解释我想做的事情。 如果可以推断出类型,我还是可以的。