TypeScript 的发展与基本语法
这是我参与第五届青训营笔记创作活动的第3天,记录了关于TypeScript的一些基础知识。
一、为什么是TypeScript
-
JS
-
动态类型:执行阶段才会进行类型的匹配和检验
-
弱类型语言:数据类型可以被忽略,一个变量可以赋不同数据类型的值
-
-
TS
-
静态类型:编译时便已经确定变量的类型,预编译就可发现类型不匹配的错误
-
弱类型语言
-
-
TS优点
-
静态类型
-
可读性增强:基于语法解析TSDoc,ide增强
-
可维护性增强:在编译阶段暴露大部分错误
- 多人合作的大型项目中,获得更好的稳定性和开发效率
-
-
JS的超集
-
包含于兼容所有JS特性,支持共存
-
支持渐进式引入与升级
-
-
二、基本语法
1. 五大基本数据类型:字符串、数字类型、布尔类型、null、undefined
- JS原生代码即可正常运行,TS的类型定义就是在后面打上": 类型"
2. 对象类型
-
不像基本数据类型TS原生具有,对象的类型通常由我们自定义,即:后面的类型
-
在TS编写约定中,一般以大写字母I开头表示这是一个类型,用以与其他变量类型区分
-
通过关键字interface进行类型定义
-
interface 类型名称{ /*类似对象属性,不过以 属性名:数据类型 方式写*/ /*属性前加readonly关键字,表示只读属性,约束属性不可在对象初始化外赋值*/ readonly jobId: number; name: string; sex: 'man' | 'woman' | 'other'; /*可选属性: 定义该属性可以不存在*/ /*定义方法: 在:前加上?*/ hobby?: string; /*任意属性:允许接口有任意的属性*/ /*一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集:*/ [key: string]: any;/*any: TS特有类型,代表全部*/ }
-
3. 函数类型
-
可以直接在函数上加上变量类型和返回值类型,但结构太长可读性差
-
也可以定义接口,将类型整合在接口中,更清晰
函数重载
-
函数重载返回值必须是函数实现的子集,或者超集。
-
TS 在检查一个函数重载的返回值与其实现的返回值是否兼容时,是直接看整体的。
- 如果函数重载无返回值,兼容。
- 如果函数重载的返回值是函数实现的返回值的子集,兼容。
- 如果函数重载的返回值是函数实现的返回值的超集,也兼容。
4. 数组类型
-
类型+方括号
-
泛型表示
-
元祖表示
-
接口表示
5. 补充类型——空类型、任意类型、枚举类型
6. 泛型
- 大部分编程语言都有,为了方便变量约束,并在不同变量类型情况下达到不同效果
泛型约束
7. 类型别名 和 类型断言
-
type关键字定义类型别名
-
as关键字进行类型断言
8. 字符串/数字 字面量(限定范围)
三、高级类型
1. 联合/交叉类型
-
联合类型:IA | IB;联合类型表示一个值可以是几种类型之一
-
交叉类型:IA & IB;多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性
2. 类型保护与类型守卫
- 访问联合类型时,出于程序安全,仅能访问联合类型中的交集部分。
- 类型守卫:定义一个函数,它的返回值是一个类型谓词,生效范围为子作用域
3. keyof、in关键字
我们有这样的需求,函数有两个参数sourceObj,targetObj,并且sourceObj为targetObj的子集
怎么判断子集呢?现在我们不需要循环遍历判断,只需要keyof和in关键字
4. 函数返回值类型,关键字extends和infer
我们知道可以将一个函数作为参数,但是在TS中我们怎么写返回值呢
四、工程应用
- webpack
- Node.js
五、参考
- 字节录播课 - TypeScript 的发展与基本语法
- 字节录播课 - TypeScript 高级数据类型