我得到一个类型';{}';我应该在哪里得到一个类型号(TypeScript)
在下面的TypeScript代码中,这是一个更完整类的子集,我有一些函数,比如map和foldr。当我运行以下代码时:我得到一个类型';{}';我应该在哪里得到一个类型号(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
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;
}