我有一段代码:
function reverse<T extends Number, D extends Number>(items: T[], m: D): T[] {
var toreturn = [];
for (var i = items.length - 1; i >= 0; i--) {
(()=>{
toreturn.push(items[i] * m);
})();
}
return toreturn;
}
var sample = [1, 2, 3];
var reversed = reverse(sample, 10);
console.log(reversed);
我的IDE说这里有2个错误:
错误:(5,27)TS2362:算术运算的左侧 必须是“any”,“number”或枚举类型。
错误:(5,38)TS2363:算术运算的右侧 必须是“any”,“number”或枚举类型。
基本上关于实体不能成倍增加,因为它们不是数字或其他合理的类型。我已经将扩展添加到通用定义中。
如何修复?
相关打字稿游乐场版本为here
答案 0 :(得分:1)
有点烦人,但由于你的约束是针对Number
的大写N,你必须对Number
进行类型断言然后number
:
(items[i] as Number as number) * (m as Number as number)
如果它适用于函数的使用方式,您可以将通用约束更改为number
而不是Number
,这样您只需要断言number
。或许你真的不需要泛型?在这种情况下,请删除泛型,并将T
和D
类型替换为number
。
请注意,实际上不需要第二个通用约束,因为m
的类型可以只是基类型而不影响返回类型,所以你可以通过这样做来改进它: / p>
function reverseAndMultiplyBy<T extends number>(items: T[], m: number): T[] {
const toreturn = [];
for (let i = items.length - 1; i >= 0; i--) {
toreturn.push((items[i] as number) * m);
}
return toreturn;
}
答案 1 :(得分:1)
您可以使用类型断言告诉编译器您知道这些将是数字。
function reverse<T extends number, D extends number>(items: T[], m: D): T[] {
var toreturn = [];
for (var i = items.length - 1; i >= 0; i--) {
(()=>{
toreturn.push(<number>items[i] * <number>m);
})();
}
return toreturn;
}
var sample = [1, 2, 3];
var reversed = reverse(sample, 10);
console.log(reversed);
答案 2 :(得分:1)
你在这里使用了cast或asert类型断言:
http://www.typescriptlang.org/docs/handbook/basic-types.html
从上面的链接中提取(basic-types.html):
类型断言有两种形式。一个是“角括号”语法:
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
另一个是as-syntax:
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
function reverse<T extends number, D extends number>(items: T[], m: D): T[] {
var toreturn = [];
for (var i = items.length - 1; i >= 0; i--) {
(()=>{
toreturn.push(<number>items[i] * <number>m);
})();
}
return toreturn;
}
var sample = [1, 2, 3];
var reversed = reverse(sample, 10);
console.log(reversed);
如果你不能在extends上使用数字,这可能会有用:
toreturn.push( (<Number>items[i] as number) * (<Number>m as number) );
function reverse<T extends Number, D extends Number>(items: T[], m: D): T[] {
var toreturn = [];
for (var i = items.length - 1; i >= 0; i--) {
(()=>{
toreturn.push( (<Number>items[i] as number) * (<Number>m as number) );
})();
}
return toreturn;
}
var sample = [1, 2, 3];
var reversed = reverse(sample, 10);
console.log(reversed);