Skip to content

Commit 4d13768

Browse files
committed
docs(any): fix #8
1 parent 7a11026 commit 4d13768

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

docs/any.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,34 @@ $ tsc --noImplicitAny app.ts
6565

6666
上面命令使用了`noImplicitAny`编译选项进行编译,这时上面的函数`add()`就会报错。
6767

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+
6896
### 污染问题
6997

7098
`any`类型除了关闭类型检查,还有一个很大的问题,就是它会“污染”其他变量。它可以赋值给其他任何类型的变量(因为没有类型检查),导致其他变量出错。

docs/intro.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ delete y.foo; // 报错
8080
y.bar = 2; // 报错
8181
```
8282

83-
上面示例中,例一的报错是因为变量一旦赋值了,就不允许再改变类型,即变量的类型是静态的。例二的报错是因为对象的属性也是静态的,不允许随意增删。
83+
上面示例中,例一的报错是因为变量赋值时,TypeScript 已经推断确定了类型,后面就不允许再赋值为其他类型的值,即变量的类型是静态的。例二的报错是因为对象的属性也是静态的,不允许随意增删。
8484

8585
TypeScript 的作用,就是为 JavaScript 引入这种静态类型特征。
8686

0 commit comments

Comments
 (0)