Mortal红尘 Mortal红尘
首页
  • 学习笔记

    • 前端
    • 后端
  • 《ES6教程》
  • 《Git教程》
  • 《JavaScript教程》
  • 《JavaScript文章》
  • 《TypeScript 从零实现 axios》
  • 《Vue教程》
  • 《Vue文章》
  • 《页面与效果》
  • 技术文档
  • GitHub技巧
  • Nodejs
  • Linux
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Mortal红尘

热爱各种技术的一枚憨憨前端
首页
  • 学习笔记

    • 前端
    • 后端
  • 《ES6教程》
  • 《Git教程》
  • 《JavaScript教程》
  • 《JavaScript文章》
  • 《TypeScript 从零实现 axios》
  • 《Vue教程》
  • 《Vue文章》
  • 《页面与效果》
  • 技术文档
  • GitHub技巧
  • Nodejs
  • Linux
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 《ES6 教程》

  • 《Git》

  • 《JavaScript教程》

  • 《TypeScript 从零实现 axios》

    • 初识 TypeScript

    • TypeScript 常用语法

      • 基础类型
      • 变量声明
      • 接口
      • 类
      • 函数
      • 泛型
      • 类型推断
        • 基础
        • 最佳通用类型
        • 上下文类型
      • 高级类型
    • ts-axios 项目初始化

    • ts-axios 基础功能实现

    • ts-axios 异常情况处理

    • ts-axios 接口扩展

    • ts-axios 拦截器实现

    • ts-axios 配置化实现

    • ts-axios 取消功能实现

    • ts-axios 更多功能实现

    • ts-axios 单元测试

    • ts-axios 部署与发布

  • 《Vue》

  • JavaScript文章

  • Vue文章

  • 页面

  • 知识库
  • 《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
上次更新: 2024/12/19, 12:18:44
泛型
高级类型

← 泛型 高级类型→

最近更新
01
TypeScript-概要
8月22日
02
TypeScript快速上手
8月22日
03
常用Git命令清单
11-18
更多文章>
Theme by Vdoing | Copyright © 2021-2025 Mortal红尘 | 黔ICP备2021006288号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×