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