我得到一个类型';{}';我应该在哪里得到一个类型号(TypeScript)

我得到一个类型';{}';我应该在哪里得到一个类型号(TypeScript),typescript,Typescript,在下面的TypeScript代码中,这是一个更完整类的子集,我有一些函数,比如map和foldr。当我运行以下代码时: var s = new ArrayList<number>(); s.append(5, 6, 7, 8); var i : number = s.foldr(max, 0); var s=newarraylist(); s、 附加(5,6,7,8); 变量i:number=s.foldr(最大值,0); 最后出现了一个错误,例如“Type'{}”不可分配给T

在下面的TypeScript代码中,这是一个更完整类的子集,我有一些函数,比如map和foldr。当我运行以下代码时:

var s = new ArrayList<number>();
s.append(5, 6, 7, 8);

var i : number = s.foldr(max, 0);
var s=newarraylist();
s、 附加(5,6,7,8);
变量i:number=s.foldr(最大值,0);
最后出现了一个错误,例如“Type'{}”不可分配给Type'number”。“我认为,该类型应该是一个数字。我可以这样证明:

foldr的类型签名是:foldr(f:(x:T,y:B)=>B,init:B):B。因为T来自ArrayList,所以它是一个数字。函数以0的形式传递init,这是一个数字,max是max(x:T,y:T):T,它设置B=T,因为x是T(即使它们可能是不同的Ts,但在本例中不是)

但不管怎样,我还是会犯这个错误。我犯了一个根本性的错误吗

下面是代码示例,也可在和上获得

类数组列表{
私有数据:数组;
公共构造函数(){
这是。_data=new Array();
}
public get length():number{返回此。\u data.length;}
公共附加(…项:T[]):无效{
此._数据=此._数据.concat(项目);
}
公共获取(n:编号):T{
返回此。_数据[n];
}
公共foldr(f:(x:T,y:B)=>B,init:B):B{
如果(this.length==0)返回init;
var结果=init;
对于(var i=此._data.length-1;i>=0;--i){
结果=f(该数据[i],结果);
}
返回结果;
}
}
函数max(x:T,y:T):T{
返回x>y?x:y;
}
var s=新的ArrayList();
s、 附加(5,6,7,8);
//类型“{}”不可分配给类型“number”。
变量i:number=s.foldr(最大值,0);

示例代码中的
foldr
方法采用类型参数


我不是有意这么做的,因为它应该更通用。这样的原因主要是因为Haskell,类型是(a->b->b)->b->a]->b。我认为原因是您可能希望将列表的类型转换为其他类型,例如转换为字符串。如果您希望它更通用,请使用第一个代码块(即提供类型参数)。如果因为ArrayList有数字类型参数,所以希望它是
number
,请使用第二个。因此,本质上,必须提供类型参数,它不会从参数中推断出来?阅读本规范第1.9节,它确实表明它可以推断参数-但在示例中它总是使用lambdas。所以也许我真正想弄清楚的是这个推论的局限性。不要排除将来更好的推论——但这是目前的情况。
class ArrayList<T> {
    private _data : Array<T>;

    public constructor() {
        this._data = new Array<T>();
    }

    public get length():number { return  this._data.length; }

    public append(...items : T[]) : void {
        this._data = this._data.concat(items);
    }

    public get(n : number) : T {
        return this._data[n];
    }

    public foldr<B>(f : (x : T, y : B) => B, init : B) : B {
        if (this.length == 0) return init;

        var result = init;

        for (var i = this._data.length - 1; i >= 0; --i) {
            result = f(this._data[i], result);
        }

        return result;
    }

}

function max<T>(x : T, y : T) : T {
    return x > y ? x : y;
}

var s = new ArrayList<number>();
s.append(5, 6, 7, 8);

//  Type '{}" is not assignable to type 'number'.
var i : number = s.foldr(max, 0); 
var i : number = s.foldr<number>(max, 0); 
public foldr(f : (x : T, y : T) => T, init : T) : T {
    if (this.length == 0) return init;

    var result = init;

    for (var i = this._data.length - 1; i >= 0; --i) {
        result = f(this._data[i], result);
    }

    return result;
}