【问题标题】:Generics type that extends from Number results in TS2362 error从 Number 扩展的泛型类型导致 TS2362 错误
【发布时间】:2016-07-18 17:23:00
【问题描述】:

我有一段代码:

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

【问题讨论】:

    标签: generics typescript arrow-functions


    【解决方案1】:

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

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

    如果它适用于函数的使用方式,您可以将通用约束更改为number 而不是Number,因此您只需声明number。或者也许你真的不需要泛型?在这种情况下,删除泛型并将类型 TD 替换为 number

    请注意,实际上不需要第二个泛型约束,因为 m 的类型可以只是基本类型而不影响返回类型,因此您可以通过这样做来改进它:

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

    【讨论】:

      【解决方案2】:

      您可以使用类型断言告诉编译器您知道这些将是数字。

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

      【讨论】:

        【解决方案3】:

        你使用了强制转换或断言你看这里类型断言:

        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


        更新:

        如果您不能在扩展时使用数字,这可能会起作用:

        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-25
          相关资源
          最近更新 更多