Typescript我如何推断类型,如管道方法?

时间:2018-09-20 15:37:04

标签: typescript

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或返回另一个构造函数。 如果需要用于推断类型或更改类型的管道,操作员可以调用管道的方法。

我的解释可能不足以解释我想做的事情。 如果可以推断出类型,我还是可以的。

0 个答案:

没有答案