Add section about type guards inferred from in operator. PR1036

This commit is contained in:
zhongsp 2019-08-23 11:18:03 +08:00
parent 9733f00baa
commit 8bfb080f80

View File

@ -165,6 +165,9 @@ if ((pet as Fish).swim) {
TypeScript里的*类型守卫*机制让它成为了现实。
类型守卫就是一些表达式,它们会在运行时检查以确保在某个作用域里的类型。
### 使用类型判定
要定义一个类型守卫,我们只要简单地定义一个函数,它的返回值是一个*类型谓词*
```ts
@ -192,6 +195,20 @@ else {
注意TypeScript不仅知道在`if`分支里`pet`是`Fish`类型;
它还清楚在`else`分支里,一定*不是*`Fish`类型,一定是`Bird`类型。
### 使用`in`操作符
`in`操作符可以作为类型细化表达式来使用。
对于`n in x`表达式,其中`n`是字符串字面量或字符串字面量类型且`x`是个联合类型,那么`true`分支的类型细化为有一个可选的或必须的属性`n``false`分支的类型细化为有一个可选的或不存在属性`n`。
```ts
function move(pet: Fish | Bird) {
if ("swim" in pet) {
return pet.swim();
}
return pet.fly();
}
```
## `typeof`类型守卫
现在我们回过头来看看怎么使用联合类型书写`padLeft`代码。