从Number中扩展的泛型类型导致TS2362错误

时间:2016-03-30 15:31:10

标签: generics typescript arrow-functions

我有一段代码:

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

3 个答案:

答案 0 :(得分:1)

有点烦人,但由于你的约束是针对Number的大写N,你必须对Number进行类型断言然后number

(items[i] as Number as number) * (m as Number as number)

如果它适用于函数的使用方式,您可以将通用约束更改为number而不是Number,这样您只需要断言number。或许你真的不需要泛型?在这种情况下,请删除泛型,并将TD类型替换为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);

here

更新

如果你不能在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);

here