Add section about type guards inferred from in operator. PR1036
This commit is contained in:
parent
9733f00baa
commit
8bfb080f80
@ -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`代码。
|
||||
|
Loading…
Reference in New Issue
Block a user