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

时间:2014-12-09 09:07:34

标签: typescript

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

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

var i : number = s.foldr(max, 0);

我最终收到错误,例如&#34; Type&#39; {}&#34;不能分配类型&#39;数字&#39;。&#34;方式,我正在计算它,类型应该是一个数字。我会这样说理由:

foldr的类型签名是:foldr(f:(x:T,y:B)=&gt; B,init:B):B。因为T来自ArrayList,所以它是一个数字。该函数初始化为0,这是一个数字,max是max(x:T,y:T):T,它设置B = T,因为x是T(即使它们可能是不同的Ts,它们不在这种情况)。

但无论如何,我仍然会遇到这个错误。我正在犯一个根本性的错误吗?

代码示例如下所示,也可在gistsplayground上找到。

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); 

1 个答案:

答案 0 :(得分:2)

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

var i : number = s.foldr<number>(max, 0); 

虽然,也许你不打算这样做。这个版本重用了T类型的参数意味着它一切正常(尽管你必须确保这是你想要的)。

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;
}