在下面的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,它们不在这种情况)。
但无论如何,我仍然会遇到这个错误。我正在犯一个根本性的错误吗?
代码示例如下所示,也可在gists和playground上找到。
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);
答案 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;
}