官方链接

在 TypeScript 中,当没有显式类型注释时,有几个地方使用类型推断来提供类型信息。
比如 let a = 3;

a 被推导成 number 类型。

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

在大多数情况下,类型推断很简单。 在以下部分中,我们将探讨如何推断类型的一些细微差别。

Best common type

当从多个表达式进行类型推断时,这些表达式的类型用于计算“最佳公共类型”。

let x = [0, 1, null];let x: (number | null)[]

要推断上例中 x 的类型,我们必须考虑每个数组元素的类型。 这里我们给出了数组类型的两种选择:数字和空值。 最佳通用类型算法会考虑每个候选类型,并选择与所有其他候选类型兼容的类型。

因为必须从提供的候选类型中选择最好的公共类型,所以在某些情况下类型共享一个公共结构,但没有一种类型是所有候选类型的超类型。

let zoo = [new Rhino(), new Elephant(), new Snake()];let zoo: (Rhino | Elephant | Snake)[]

基于上下文的类型推导 - Contextual Typing

在 TypeScript 的某些情况下,类型推断也适用于“另一个方向”。这被称为“上下文类型”。当表达式的类型由其位置隐含时,就会发生上下文类型化。例如:

window.onmousedown = function (mouseEvent) {console.log(mouseEvent.button); //<- OKconsole.log(mouseEvent.kangaroo); //<- Error!
};

在这里,TypeScript 类型检查器使用 Window.onmousedown 函数的类型来推断赋值右侧的函数表达式的类型。 当它这样做时,它能够推断 mouseEvent 参数的类型,该参数确实包含 button 属性,但不包含 kangaroo 属性。

TypeScript 足够智能,可以推断其他上下文中的类型:

window.onscroll = function (uiEvent) {console.log(uiEvent.button); //<- Error!
};

基于上述函数被分配给 Window.onscroll 的事实,TypeScript 知道 uiEvent 是一个 UIEvent,而不是像前面的例子那样的 MouseEvent。 UIEvent 对象不包含按钮属性,因此 TypeScript 会抛出错误。

如果此函数不在上下文类型位置,则该函数的参数将隐式具有类型 any,并且不会发出错误(除非您使用 --noImplicitAny 选项):

const handler = function (uiEvent) {console.log(uiEvent.button); //<- OK
};

我们还可以显式地为函数的参数提供类型信息以覆盖任何上下文类型:

window.onscroll = function (uiEvent: any) {console.log(uiEvent.button); //<- Now, no error is given
};

TypeScript 的类型推导 Type Inference相关推荐

  1. TypeScript 交叉类型(intersection type)

    在TS中和联合类型(union type)对应的还有交叉类型(intersection type). 交叉类型的出现主要为了组合多个对象类型(object type),因为相对于interface,o ...

  2. TypeScript 联合类型(union type)

    TS是JS的超集,在JS的基础上添加了一套类型系统,这样的TS可以被静态分析带来的好处显而易见. let val: string = 'val'; 声明一个string类型的变量val. let va ...

  3. TypeScript类型推论(Type Inference)

    要完全理解类型推论需要完整理解类型上下文,并且理解TS对于是否可以使用类型推论是基于静态分析完成的. 上下文类型应用在许多地方.常见的例子包括函数调用的参数,赋值的右手端位置,类型断言,对象和数组的成 ...

  4. 关于 TypeScript 联合类型 union type 赋值的一个错误消息

    今天我做开发时遇到如下的 TypeScript 错误: Type 'Observable<boolean | undefined>' is not assignable to type ' ...

  5. 【ts】typescript高阶:键值类型及type与interface区别

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 typescript高阶之键值类型及type与interface区别 前言 一.键值类型的语法 1.语法 2.错误例子 3.正确例子 ...

  6. typescript索引类型_复杂场景下的 typescript 类型锚定 (1) ----- 对象索引提取-阿里云开发者社区...

    前言:在编写 typescript 应用的时候,有时候我们会希望复用或者构造一些特定结构的类型,这些类型只从 typescript 靠内建类型和 interface.class 比较难以表达,这时候我 ...

  7. JavaScript 和 TypeScript 交叉口 —— 类型定义文件(*.d.ts)

    在 <从 JavaScript 到 TypeScript 系列> 文章我们已经学习了 TypeScript 相关的知识. TypeScript 的核心在于静态类型,我们在编写 TS 的时候 ...

  8. vue props使用typescript自定义类型

    前言 Base: vue@3.2.33 + typescript@4.1.6 + npm@8.5.0 尝试解决将ts中自定义的interface/type,传vue的props属性的问题. 记录一下过 ...

  9. 简单探讨TypeScript 枚举类型

    这篇文章主要介绍了TypeScript 枚举类型,TypeScript 在 ES 原有类型基础上加入枚举类型,使得在 TypeScript 中也可以给一组数值赋予名字,这样对开发者比较友好,可以理解枚 ...

最新文章

  1. java(十)IO流
  2. 安装Ubuntu时,遇到自定义交换空间swap大小设置问题
  3. Windows核心编程 第五章 作业(上)
  4. HttpWebResponse远程服务器返回错误: (500) 内部服务器错误。
  5. 苹果9是5g手机吗_苹果手机扩容对手机有影响吗
  6. Socket网络通讯开发总结之:Java 与 C进行Socket通讯
  7. nodejs读取本地txt文件并输出到浏览器
  8. Python ord 函数 - Python零基础入门教程
  9. (二)Java中的HashMap与ConcurrentHashMap的区别
  10. 24K 内存上诞生的操作系统,是如何改变计算机世界的?
  11. 手把手教你使用 VuePress 搭建个人博客
  12. 使用 pandas读取 excel 文件的数据
  13. 基于Web的MIS系统环境配置和相关含义(拷贝版)
  14. Scrapy输出CSV指定列顺序
  15. 一个有趣的Java编译问题
  16. 【天锐绿盾】2022年代理商技术认证培训考核试卷(A卷)
  17. 16个超牛逼的HTML5和JavaScript特效
  18. unity 弹痕_Unity C# 用图片融合做弹孔
  19. VSCode常用插件和快捷键总结
  20. ubuntu共享文件夹不显示及设备空间不足解决[随手笔记]

热门文章

  1. 【蓝桥杯真题】地宫取宝(搜索-记忆化搜索详解)
  2. 阿里开源Euler:国内首个工业级图表征学习框架
  3. Java获取文件路径获取访问路径、域名、项目名、请求入参
  4. hibernate实体的几种状态:
  5. Android控件— — —ImageView
  6. Hyper-V Server共享VHDX
  7. IEnumerator,IEnumerable,IEnumerableT
  8. qq邮箱使用outlook 2007
  9. Android小数和整数相互转换
  10. C# 3.0入门系列(二)