为什么typescript会添加两个数字,如字符串?

时间:2018-03-16 12:53:17

标签: typescript strong-typing

我知道打字稿是强类型的,但为什么以下代码打印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);

3 个答案:

答案 0 :(得分:4)

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

如果您删除了使用<number><any>的广告素材,您会发现TypeScript会捕获并标记您的错误。

答案 1 :(得分:1)

任何 类型在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 :(得分:1)

最后,打字稿总是转换为javascript,所以你要做的就是添加字符串&#39; 1&#39;和数字2. Javascript将数字转换为字符串,因为无法添加字符串和数字。

如果你为传递给函数的变量声明了一个类型,那么typescript转换器将输出一个错误:

var a: number = '1';
var b: number = 1;

add_numbers(a, b);

错误:

  第一行

类型不匹配

var a: string = '1';
var b: number = 1;

add_numbers(a, b);

错误:

  

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