TypeScript入门

【第二届青训营-寒假前端场】- 「TypeScript入门」笔记

什么是TypeScript

发展历史

  • 2012-10:微软发布了TypeScript第一个版本(0.8)

  • 2014-10:Angular 发布了基于TypeScript的2.0版本

  • 2015-04:微软发布了Visual Studio Code

  • 2016-05:@ ty pes/react发布,TypeScript 可开发React

  • 2020-09:Vue 发布了3.0 版本,官方支持TypeScript

  • 2021-11:v4.5版本发布

为什么是TypeScript

image.png

动态类型执行过程中进行类型的匹配,js的弱类型会在执行时进行隐式类型转换,而在静态类型中则不然

TypeScript则为静态类型:java、c/c++等

  • 可读性增强:基于语法解析TSDoc,ide增强

  • 可维护性增强:在编译阶段暴露大部分错误

  • 多人合作的大型项目中,可以获得更好的稳定性和开发效率

TypeScript是JS的超集

  • 包含于兼容所有Js特性, 支持共存

  • 支持渐进式引入与升级

基本语法

基本数据类型

js ==> ts

image.png

可以看到,ts的类型定义方式:let 变量名: 类型 = 值;

TypeScript基础类型

对象类型

接口 · TypeScript中文网

函数类型

js:

ts:函数 · TypeScript中文网

可以看到,格式为function 函数名(参数:类型...):返回值类型

函数重载

简化形式如下:

数组类型

type作用就是给类型起一个新名字,相当于c++中的typedef

TypeScript补充类型

  • 空类型:表示无赋值

  • 任意类型:是所有类型的子类型

  • 枚举类型:支持枚举值到枚举名的正、反向映射

Typescript泛型

泛型,之前学过c++的话dddd,跟c++中的差不多:不预先指定具体的类型,而在使用的时候再指定类型的一种特性

泛型还可以使用在以下场景中:

泛型还可以进行约束范围

类型别名 & 类型断言

类型断言

有时候你会遇到这样的情况,你会比TypeScript更了解某个值的详细信息。 通常这会发生在你清楚地知道一个实体具有比它现有类型更确切的类型。

通过类型断言 这种方式可以告诉编译器,“相信我,我知道自己在干什么”。 类型断言好比其它语言里的类型转换,但是不进行特殊的数据检查和解构。 它没有运行时的影响,只是在编译阶段起作用。 TypeScript会假设你,程序员,已经进行了必须的检查。

基础类型 · TypeScript中文网

上述代码,中有几个点需注意:

reduce() 函数对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。

语法:arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])

字符串/数字 字面量

高级类型

联合/交叉类型

为书籍列表编写类型 -> ts类型声明繁琐存在较多重复。高级类型

  • 联合类型: IA | IB; 联合类型表示一个值可以是几种类型之一

  • 交叉类型: IA & IB; 多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性

上述代码可以通过ts简化为:

类型保护与类型守卫

  • 访问联合类型时,处于程序安全,仅能访问联合类型中的交集部分

上述报错可通过类型守卫解决:定义一个函数,其返回值是一个类型谓词生效范围为子作用域

或者typeof和instance判断

不会每次都这么麻烦吧,事实上,只有当两个类型没有任何重合点的话才需要类型守卫,如上述的书本例子,可以进行自动类型推断。

再来看一个case,实现一个子集不污染的合并函数merge,将sourceObj合并到targetObj中,sourceObj必须为targetObj的子集

而一种简单的思想就是在ts中编写两个类型,进行判断,但这样又会存在实现繁琐,增加target需要source联动去除,重复维护了两份x、y

通过泛型,改进,这里涉及到几个个知识点

  • Partial:一个常见的任务是将一个已知的类型每个属性都变为可选的

TypeScript提供了从旧类型中创建新类型的一种方式——映射类型。 在映射类型里,新类型以相同的形式去转换旧类型里每个属性。 (直接写就行,ts内置了)

  • 关键字keyof,其相当于取值对象中的所有key组成的字符串字面量

  • 关键字in,其相当于取值字符串字面量中的一种可能,配合泛型P, 即表示每个key

  • 关键字 ? ,通过设定对象可选选项,即可自动推导出子集类型

函数返回值类型

函数返回值类型在定义时候是不明确的,也应该通过泛型进行表达

下文代码delayCall接受一个函数作为入参,其实现延迟1s运行函数func,其返回promise,结果为入参函数的返回结果

  • 关键字 extends 跟随泛型出现时,表示类型推断,其表达可类比三元表达式

    • T === 判断类型?类型A:类型B -> T extends 判断类型?类型A:类型B

  • 关键字 infer 出现在类型推荐中,表示定义类型变量,可以用于指代类型

    infer 简单示例如下:

    在这个条件语句 T extends (...args: infer P) => any ? P : T 中,infer P 表示待推断的函数参数。

    整句表示为:如果 T 能赋值给 (...args: infer P) => any,则结果是 (...args: infer P) => any 类型中的参数 P,否则返回为 T

    • 在这里就相当于把这个函数返回值类型指代为R

工程应用

TypeScript工程应用——Web

  1. 配置webapack loader相关配置

  2. 配置tsconfig.js文件(宽松——严格,都可以定义)

  3. 运行webpack启动/ 打包

  4. loader处理ts文件时, 会进行编译与类型检查

相关loader:

TypeScript工程应用——Node

使用TSC编译

  1. 安装Node与npm

  2. 配置tsconfig.js文件

  3. 使用npm安装tsc

  4. 使用tsc运行编译得到js文件

image.png

总结感想

这节课老师讲了TypeScript的用处与基本语法、和JS的对比、高级类型的应用,后续也深入讲了一下类型保护与类型守卫,在最后总结了TypeScript如何在工程中进行应用。TypeScript作为JS的一个超集,他增加了类型检查的功能,可以在编译阶段就将代码中的错误暴露出来,这是js这类动态类型所不具备的,在多人合作的大型项目中,使用TS往往可以获得更好的稳定性和开发效率。

本文引用的大部分内容来自林皇老师的课以及ts官方文档~

最后更新于

这有帮助吗?