【问题标题】:Why typescript adds two numbers like strings?为什么打字稿会像字符串一样添加两个数字?
【发布时间】:2018-08-25 13:14:09
【问题描述】:

我知道 typescript 是强类型的,但为什么下面的代码打印的是 12 而不是 3

function add_numbers(a: number, b: number){
    return a + b;
}

var a = '1';
var b = 2;

var result = add_numbers(<number><any>a, b);

console.log(result);

【问题讨论】:

  • 我的意思是,很明显一个是字符串分隔的,对吧?
  • 因为&lt;number&gt;&lt;any&gt;a 绕过了任何强类型。

标签: typescript strong-typing


【解决方案1】:

any 类型在 TypeScript 类型系统中占有特殊的位置。它为您提供了一个从类型系统中逃脱的舱口,告诉编译器别管它。 any 与类型系统中的任何和所有类型兼容。这意味着任何东西都可以分配给它,它可以分配给任何东西。这在下面的示例中得到了证明:

var power: any;

// Takes any and all types
power = '123';
power = 123;

// Is compatible with all types
var num: number;
power = num;
num = power;

参考:https://basarat.gitbooks.io/typescript/content/docs/types/type-system.html

【讨论】:

    【解决方案2】:

    Typescript 在编译时是强类型的,如果你写的代码不好,它不能防止运行时错误。您已经使用 &lt;any&gt; 覆盖了类型以欺骗编译器,因此当您的函数运行时,将执行向数字添加字符串的正常 javascript 行为。

    如果您删除正在使用 &lt;number&gt;&lt;any&gt; 进行的转换,您将看到 TypeScript 捕获并标记您的错误。

    【讨论】:

      【解决方案3】:

      最后,打字稿总是转换成javascript,所以你要做的是添加字符串'1'和数字2。Javascript将数字转换为字符串,因为不可能添加字符串和a号码。

      如果你为传递给函数的变量定义类型,打字稿转译器将输出错误:

      var a: number = '1';
      var b: number = 1;
      
      add_numbers(a, b);
      

      错误:

      第一行的类型不匹配

      var a: string = '1';
      var b: number = 1;
      
      add_numbers(a, b);
      

      错误:

      函数调用中的参数类型错误

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-01
        • 2018-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多