mirror of
https://github.com/wangdoc/typescript-tutorial.git
synced 2025-12-20 16:55:06 +08:00
docs(any): fix #8
This commit is contained in:
28
docs/any.md
28
docs/any.md
@@ -65,6 +65,34 @@ $ tsc --noImplicitAny app.ts
|
||||
|
||||
上面命令使用了`noImplicitAny`编译选项进行编译,这时上面的函数`add()`就会报错。
|
||||
|
||||
这里有一个特殊情况,即使打开了`noImplicitAny`,使用`let`和`var`命令声明变量,但不赋值也不指定类型,是不会报错的。
|
||||
|
||||
```typescript
|
||||
var x; // 不报错
|
||||
let y; // 不报错
|
||||
```
|
||||
|
||||
上面示例中,变量`x`和`y`声明时没有赋值,也没有指定类型,TypeScript 会推断它们的类型为`any`。这时即使打开了`noImplicitAny`,也不会报错。
|
||||
|
||||
```typescript
|
||||
let x;
|
||||
|
||||
x = 123;
|
||||
x = { foo: 'hello' };
|
||||
```
|
||||
|
||||
上面示例中,变量`x`的类型推断为`any`,但是不报错,可以顺利通过编译。
|
||||
|
||||
由于这个原因,建议使用`let`和`var`声明变量时,如果不赋值,就一定要显式声明类型,否则可能存在安全隐患。
|
||||
|
||||
`const`命令没有这个问题,因为 TypeScript 要求`const`声明变量时,必须同时进行初始化(赋值)。
|
||||
|
||||
```typescript
|
||||
const x; // 报错
|
||||
```
|
||||
|
||||
上面示例中,`const`命令声明的`x`是不能改变值的,声明时必须同时赋值,否则报错,所以它不存在类型推断为`any`的问题。
|
||||
|
||||
### 污染问题
|
||||
|
||||
`any`类型除了关闭类型检查,还有一个很大的问题,就是它会“污染”其他变量。它可以赋值给其他任何类型的变量(因为没有类型检查),导致其他变量出错。
|
||||
|
||||
@@ -80,7 +80,7 @@ delete y.foo; // 报错
|
||||
y.bar = 2; // 报错
|
||||
```
|
||||
|
||||
上面示例中,例一的报错是因为变量一旦赋值了,就不允许再改变类型,即变量的类型是静态的。例二的报错是因为对象的属性也是静态的,不允许随意增删。
|
||||
上面示例中,例一的报错是因为变量赋值时,TypeScript 已经推断确定了类型,后面就不允许再赋值为其他类型的值,即变量的类型是静态的。例二的报错是因为对象的属性也是静态的,不允许随意增删。
|
||||
|
||||
TypeScript 的作用,就是为 JavaScript 引入这种静态类型特征。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user