TypeScript 高级数据类型( 二)| 青训营笔记

99 阅读3分钟
这是我参与「第五届青训营 」伴学笔记创作活动的第 8天✌

课堂笔记


本堂课重点内容:

通过高级类型的方式,将普通类型的解决方案进行高级化:
  1. 联合交叉类型
  2. 类型保护与类型守卫
  3. Merge 函数类型实现
  4. 函数返回值类型
  5. TypeScript 工程应用

详细知识点介绍

1.联合/交叉类型

image.png

  • 联合类型: IA | IB;联合类型表示一个值可以是几种类型之一
  • 交叉类型: IA & IB; 多种类型叠加到合并成为一种类型,它包含了所需的所有类型的特性

image.png

2.类型保护与类型守卫

在联合类型未确定之前,不能够访问联合类型中非并集的部分。

image.png

解决方法:这时我们需要根据不同的类型来做不同的操作,这时候就可以使用类型谓词,类型谓词可以协助编译器进行类型推断

image.png

ps:"!!" 将一个其他类型转换成boolean类型,类似于Boolean()

也可以使用typeofinstanceof来进行类型保护。

来看看上一个例子:

image.png

只有当两个类型没有任何重合点的话才需要类型守卫。上一个例子就可以进行自动类型推断。

image.png

3.Merge 函数类型实现

在js中有两种方法:

  • 为了保证不污染可用merge1函数实现,但实现起来复杂。

  • 若两个入参sourceObj和targetObj均正确,则可直接使用merge2函数实现。

image.png

在ts中实现则需要编写两个类型进行判断,但若如果增加了target则需要联动source去除,重复维护x和y。

image.png

image.png

优雅方式:可选类型(Partial<T>)

泛型: 希望拥有一个类型,该类型传入任何一个类型之后变成了它的子集;而不是像上面定义两个类型而重复表达。

image.png

4.函数返回值类型

在传入调用函数是才能知道函数的返回类型。

image.png

infer R:

待推断类型,使用 infer 标记类型 R,就可以使用待推断的类型 R作为函数的返回值类型。 image.png

5.TypeScript 工程应用

TypeScript 工程应用分为两部分:浏览器WebNode.js的应用。

TypeScript工程应用——Web

webpack
1.配置webapack loader相关配置
2.配置tsconfg.js文件
3.运行webpack启动 /打包
4.loader处理ts文件时,会进行编译与类型检查

相关loader(转化器):

  1. awesome-typescript-loader
  2. babel-loader

TypeScript工程应用——Node

image.png

课后个人总结

Q&A:

  1. Q: 原子类型可以合并吗?

    A: 如果仅仅把基本类型字面量类型函数类型等原子类型合并成交叉类型,是没有任何用处的。因为任何类型都不能满足同时属于多种原子类型。

type Useless = string & number; // 就是个never

  1. Q:字面量类型是什么?

    A:1 | 2, true | false, ‘click’ | ‘scroll’ | 'mousemove’被称为字面量类型,分别为数字、布尔、字符串字面量类型,可以用来约束取值只能是其中几个值中的一个。

  2. Q: webpack中loader的作用是什么?
    A:webpack默认只能打包处理 .js 后缀名结尾的模块,而loader可以把webpack本身不能识别的非js文件转化为其可以识别的文件,相当于一个转化器。在ts工程化应用中就可以把ts文件转化为js文件供webpack进行识别处理。

容易混淆的点:

类型保护中(原始类型保护)typeof和(类型保护)instanceof用法区别:

  • typeof用来判断数据的类型是否是某个原始类型(numberstringbooleansymbol)并进行类型保护

格式: typeof a ===/!== "typename"

"typename"必须是 "number", "string", "boolean"或 "symbol"

  • instanceof 的对象则是一个构造函数

格式: ` a instanceof "constructorName"``

需要注意的点:

泛型必须是对象,对象才有key*

引用参考

blog.csdn.net/weixin_4997…allfirst_rank_ecpm_v1~rank_v31_ecpm-3-128726712-null-null.142^v71^control,201^v4^add_ask&utm_term=typescript%20%E9%9D%92%E8%AE%AD%E8%90%A5%20%E8%81%94%E5%90%88%E4%BA%A4%E5%8F%89%E7%B1%BB%E5%9E%8B&spm=1018.2226.3001.4187