### 彪哥

爱好前端

- 初识 TypeScript

- TypeScript 常用语法

  - 基础类型
  - 变量声明
  - 接口
  - 类
  - 函数
  - 泛型
  - 类型推断
    - 基础
    - 最佳通用类型
    - 上下文类型
  - 高级类型

- ts-axios 项目初始化

- ts-axios 基础功能实现

- ts-axios 异常情况处理

- ts-axios 接口扩展

- ts-axios 拦截器实现

- ts-axios 配置化实现

- ts-axios 取消功能实现

- ts-axios 更多功能实现

- ts-axios 单元测试

- ts-axios 部署与发布

- 《TypeScript 从零实现 axios》
- TypeScript 常用语法

HuangYi
2020-01-05
目录

# 类型推断

# # 类型推断

这节介绍 TypeScript 里的类型推断。即，类型是在哪里如何被推断的。

## # 基础

TypeScript 里，在有些没有明确指出类型的地方，类型推断会帮助提供类型。如下面的例子：

    let x = 3

1

变量 `x` 的类型被推断为数字。 这种推断发生在初始化变量和成员，设置默认参数值和决定函数返回值时。

大多数情况下，类型推断是直截了当地。后面的小节，我们会浏览类型推断时的细微差别。

## # 最佳通用类型

有些时候我们需要从几个表达式中推断类型，会使用这些表达式的类型来推断出一个最合适的通用类型。例如，

    let x = [0, 1, null]

1

为了推断 `x` 的类型，我们必须考虑所有元素的类型。 这里有两种选择：`number` 和 `null`。 计算通用类型算法会考虑所有的候选类型，并给出一个兼容所有候选类型的类型。

由于最终的通用类型取自候选类型，有些时候候选类型共享一个公共结构，但是却没有一个类型能做为所有候选类型的超级类型。例如：

    class Animal {
      numLegs: number
    }

    class Bee extends Animal {
    }

    class Lion extends Animal {
    }

    let zoo = [new Bee(), new Lion()]

1
2
3
4
5
6
7
8
9
10
11

这里，我们想让 `zoo` 被推断为 `Animal[]` 类型，但是这个数组里没有对象是 `Animal` 类型的，因此不能推断出这个结果。 为了更正，我们可以明确的声明我们期望的类型：

    let zoo: Animal[] = [new Bee(), new Lion()]

1

如果没有找到最佳通用类型的话，类型推断的结果为联合数组类型，`(Bee | Lion)[]`

## # 上下文类型

有些时候，TypeScript 类型推断会按另外一种方式，我们称作“上下文类型”；上下文类型的出现和表达式的类型以及所处的位置相关。比如：

    window.onmousedown = function(mouseEvent) {
      console.log(mouseEvent.clickTime)  // Error
    }

1
2
3

这个例子会得到一个类型错误，TypeScript 类型检查器使用 `window.onmousedown` 函数的类型来推断右边函数表达式的类型。 因此，就能推断出 `mouseEvent` 参数的类型了，所以 `mouseEvent` 访问了一个不存在的属性，就报错了。

如果上下文类型表达式包含了明确的类型信息，上下文的类型被忽略。重写上面的例子：

    window.onmousedown = function(mouseEvent:any) {
      console.log(mouseEvent.clickTime)  // OK
    }

1
2
3

这个函数表达式有明确的参数类型注解，上下文类型被忽略。这样的话就不报错了，因为这里不会使用到上下文类型。

上下文类型会在很多情况下使用到。通常包含函数的参数，赋值表达式的右边，类型断言，对象成员，数组字面量和返回值语句。上下文类型也会做为最佳通用类型的候选类型。比如：

    function createZoo(): Animal[] {
      return [new Bee(), new Lion()]
    }

    let zoo = createZoo()

1
2
3
4
5

这个例子里，最佳通用类型有 `3` 个候选者：`Animal`，`Bee` 和 `Lion`。 其中，`Animal` 会被做为最佳通用类型。

编辑
(opens new window)
#TypeScript
上次更新: 2022/12/14, 19:36:42
泛型
高级类型

← 泛型 高级类型→

最近更新

  01
Git修改分支名
08-11

  02
CSS给table的tbody添加滚动条
06-29

  03
我做了一个手写春联小网页，祝大家虎年暴富 原创
01-28

更多文章>

Copyright © 2016-2022 Hesb | MIT License

- 跟随系统
- 浅色模式
- 深色模式
- 阅读模式