为什么在TypeScript中使用'X' + Y = 'XY'?

zsohkypk  于 2023-01-27  发布在  TypeScript
关注(0)|答案(2)|浏览(108)

我正在尝试理解TypeScript及其工作原理,因此这是一个非常简单的示例:

const X: string = '5';
const Y: number = 6;
console.log(X+Y) // output '56' ! why not an error ? and why not 11 ?

对于JavaScript,这样的结果是可以接受的,但是由于TypeScript是为了避免逻辑错误而设计的,为什么它不介意我们尝试将一个“字符串”附加到一个“数字”上呢?从逻辑上讲,这是没有意义的。还有为什么默认过程是将Y视为string为什么不尝试将X转换为number呢?

2ledvvac

2ledvvac1#

TypeScript的原则之一是“您现有的工作JavaScript代码也是TypeScript代码”[link]。
有很多现有的JavaScript代码包含类似这样的部分:

const x = '5';
const y = 6;
console.log(x + y); // '56'

如果TypeScript迫使开发人员改变上述行为,那么移植将面临巨大的障碍(建议它应该输出11是不可能的;如果将文件从.js重命名为.ts会引入仅在运行时才能检测到的错误,则我们不能信任TypeScript。)
现在,您可能要反对您的代码的不同之处,因为您显式地用变量的类型来注解变量。但是TypeScript提供类型推断,如果

const x : string = '5';

产生了一个行为与稍有不同的变量

const x = '5';

语言设计总是涉及权衡,TypeScript认为为了兼容性,一些JavaScript的怪癖值得保留。

brc7rcf0

brc7rcf02#

TypeScript中,+运算符用于字符串的加法和串联。在此示例中,由于其中一个操作数(X)是字符串,因此+运算符被视为串联运算符,并将字符串'5'与数字6串联,得到字符串“56”。
在这种情况下,TypeScript不会引发错误,因为它遵循了JavaScript的行为,后者也使用+运算符进行加法和串联。这可能会引起混淆,但这是从JavaScript继承的功能,而不是TypeScript做出的设计决策。
如果要确保变量被视为数字,可以使用Number()函数将其显式转换为数字,或者使用+符号将其转换为数字。

console.log(Number(X) + Y) 
// it will output `11`
console.log(+X + Y) 
// it will also output 11

确保使用正确的类型始终是一种很好的做法,TypeScript提供了几种方法来实现这一点,例如类型转换和类型Assert。

相关问题