File tree Expand file tree Collapse file tree 2 files changed +29
-1
lines changed Expand file tree Collapse file tree 2 files changed +29
-1
lines changed Original file line number Diff line number Diff line change @@ -65,6 +65,34 @@ $ tsc --noImplicitAny app.ts
65
65
66
66
上面命令使用了` noImplicitAny ` 编译选项进行编译,这时上面的函数` add() ` 就会报错。
67
67
68
+ 这里有一个特殊情况,即使打开了` noImplicitAny ` ,使用` let ` 和` var ` 命令声明变量,但不赋值也不指定类型,是不会报错的。
69
+
70
+ ``` typescript
71
+ var x; // 不报错
72
+ let y; // 不报错
73
+ ```
74
+
75
+ 上面示例中,变量` x ` 和` y ` 声明时没有赋值,也没有指定类型,TypeScript 会推断它们的类型为` any ` 。这时即使打开了` noImplicitAny ` ,也不会报错。
76
+
77
+ ``` typescript
78
+ let x;
79
+
80
+ x = 123 ;
81
+ x = { foo: ' hello' };
82
+ ```
83
+
84
+ 上面示例中,变量` x ` 的类型推断为` any ` ,但是不报错,可以顺利通过编译。
85
+
86
+ 由于这个原因,建议使用` let ` 和` var ` 声明变量时,如果不赋值,就一定要显式声明类型,否则可能存在安全隐患。
87
+
88
+ ` const ` 命令没有这个问题,因为 TypeScript 要求` const ` 声明变量时,必须同时进行初始化(赋值)。
89
+
90
+ ``` typescript
91
+ const x; // 报错
92
+ ```
93
+
94
+ 上面示例中,` const ` 命令声明的` x ` 是不能改变值的,声明时必须同时赋值,否则报错,所以它不存在类型推断为` any ` 的问题。
95
+
68
96
### 污染问题
69
97
70
98
` any ` 类型除了关闭类型检查,还有一个很大的问题,就是它会“污染”其他变量。它可以赋值给其他任何类型的变量(因为没有类型检查),导致其他变量出错。
Original file line number Diff line number Diff line change @@ -80,7 +80,7 @@ delete y.foo; // 报错
80
80
y .bar = 2 ; // 报错
81
81
```
82
82
83
- 上面示例中,例一的报错是因为变量一旦赋值了,就不允许再改变类型 ,即变量的类型是静态的。例二的报错是因为对象的属性也是静态的,不允许随意增删。
83
+ 上面示例中,例一的报错是因为变量赋值时,TypeScript 已经推断确定了类型,后面就不允许再赋值为其他类型的值 ,即变量的类型是静态的。例二的报错是因为对象的属性也是静态的,不允许随意增删。
84
84
85
85
TypeScript 的作用,就是为 JavaScript 引入这种静态类型特征。
86
86
You can’t perform that action at this time.
0 commit comments