为什么打字稿会像字符串一样添加两个数字?

Why typescript adds two numbers like strings?

我知道 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);

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

Typescript 在编译时是强类型的,如果您编写糟糕的代码,它无法防止运行时错误。您已经使用 <any> 覆盖了类型来欺骗编译器,因此在您的函数运行时执行将字符串添加到数字的正常 javascript 行为。

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

最后,typescript 总是被转换为 javascript,所以你所做的是添加字符串 '1' 和数字 2。 Javascript 将数字转换为字符串,因为无法添加字符串和数字。

如果您删除传递给函数的变量的类型,打字稿转译器将输出错误:

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

add_numbers(a, b);

错误:

type mismatch in first line

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

add_numbers(a, b);

错误:

wrong parameter type in function call