Typescript 没有给出以下代码的编译器错误:
var b = a + 10; // Why no compilation error here
var a = 10;
alert(b.toString());
我希望第一行是一个错误,因为到目前为止我还没有声明或初始化 var a 。
如果我删除第二行,我会得到编译器错误。
我知道它在 JavaScript 中有效,但我希望 TypeScript 会给我编译错误或警告。
Typescript 没有给出以下代码的编译器错误:
var b = a + 10; // Why no compilation error here
var a = 10;
alert(b.toString());
我希望第一行是一个错误,因为到目前为止我还没有声明或初始化 var a 。
如果我删除第二行,我会得到编译器错误。
我知道它在 JavaScript 中有效,但我希望 TypeScript 会给我编译错误或警告。
因为提升行为可能会令人困惑。您的代码实际上意味着。
var a, b
b = a + 10
a = 10
alert(b.toString())
允许提升是有正当理由的,但它们不涉及var
,但是function
- 您可以调用稍后声明的函数。
alert(identity(i))
function identity(i) {
return i
}
在这种情况下,alert
使用稍后声明的函数的结果。由于提升行为,它可以工作。
虽然我同意这个案例应该有一个警告(不是错误,TypeScript 希望与 JavaScript 兼容),但 TypeScript 目前似乎没有注意到这一点。TypeScript 中的每个变量都有一个在变量生命周期内不能改变的类型,在你的情况下,a
是number
类型(它不知道你在赋值之前使用它,因为var
隐式设置类型)。TypeScript 假定它是一个数字,即使它不是,因为它的声明。
您可能希望将此报告为 TypeScript 中的错误。
假设您了解您的代码等效于:
var a, b
b = a + 10
a = 10
alert(b.toString())
这又相当于:
var a = undefined, b = undefined
b = a + 10
a = 10
alert(b.toString())
应该允许它的原因是因为 undefined 是您可以分配和读取的变量的有效值。
有各种用例表明此功能很有价值。例如打字稿中使用的模块模式:
module x{
export var foo;
}
生成利用这一事实的 javascript 代码:
var x;
(function (x) {
x.foo;
})(x || (x = {})); //x was never assigned but used in "x ||" part
由于 JavaScript 向后兼容性(更不用说它很有用),这留在了 TypeScript 中。
这是一个纯粹的 TypeScript 用例。也许您想将 undefined 传递给函数调用(这是有效的打字稿):
var a:number = undefined; // same as simply "var a"
console.log(a);
只是假设 TypeScript 开发人员想要底层 JavaScript 语言的强大功能。
对于在分配前阅读无效的语言(例如 C#),情况并非如此。在 C# 中,未分配的变量没有意义。在 JavaScript 中确实如此。所以 TypeScript必须允许这样做。