我正在尝试理解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
呢?
2条答案
按热度按时间2ledvvac1#
TypeScript的原则之一是“您现有的工作JavaScript代码也是TypeScript代码”[link]。
有很多现有的JavaScript代码包含类似这样的部分:
如果TypeScript迫使开发人员改变上述行为,那么移植将面临巨大的障碍(建议它应该输出
11
是不可能的;如果将文件从.js
重命名为.ts
会引入仅在运行时才能检测到的错误,则我们不能信任TypeScript。)现在,您可能要反对您的代码的不同之处,因为您显式地用变量的类型来注解变量。但是TypeScript提供类型推断,如果
产生了一个行为与稍有不同的变量
语言设计总是涉及权衡,TypeScript认为为了兼容性,一些JavaScript的怪癖值得保留。
brc7rcf02#
在TypeScript中,
+
运算符用于字符串的加法和串联。在此示例中,由于其中一个操作数(X
)是字符串,因此+
运算符被视为串联运算符,并将字符串'5'
与数字6串联,得到字符串“56”。在这种情况下,TypeScript不会引发错误,因为它遵循了JavaScript的行为,后者也使用
+
运算符进行加法和串联。这可能会引起混淆,但这是从JavaScript继承的功能,而不是TypeScript做出的设计决策。如果要确保变量被视为数字,可以使用
Number()
函数将其显式转换为数字,或者使用+
符号将其转换为数字。确保使用正确的类型始终是一种很好的做法,TypeScript提供了几种方法来实现这一点,例如类型转换和类型Assert。