这是我参与[第四届青训营]笔记创作活动的第6天。此笔记用于记录课上所讲内容。
一、为什么要选择使用TypeScript?
TypeScript与JavaScipt都属于弱类型语言,而不同之处在于JS是动态类型,TS是静态类型。那么我们就要知道什么是静态类型,什么是动态类型。
编程语言按照类型检查可以分为两大类:静态类型 (Static Typing) 和 动态类型 (Dynamic Typing) 。在现在比较流行的这些语言里,静态类型的代表人物有 Java、C/C++、Golang 等,动态类型有 Python、Ruby 等。我们在编写程序都要进行错误的检查,在检查错误的时候,静态和动态类型的区别就展现出来了:在于什么时候报类型的错误。动态类型是在在执行时才进行类型匹配。 而静态类型会在执行之前走编译流程。
看完了TS和JS不同的地方,接下来我们来看一下二者相同的地方:弱类型语言。
弱类型语言是一种弱类型定义的语言,某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过现行强制转换。而弱类型语言对应的强类型语言则是一种强制类型定义的语言,即一旦某一个变量被定义类型,如果不经强制转换,那么它永远就死该数据类型。
在了解了二者之间的区别后,我们就可以明白,相较于JS,TS因为是静态类型,所以拥有了静态类型的优势,即可读性增强(基于语法解析TSDoc,ide增强);可维护性增强(在编译阶段暴露大部分错误);在多人合作的大型项目中,获得更好地稳定性和开发效率 。 同时也作为JS的超集包含于兼容所有奇数特性,支持共存;也支持渐进式引入与升级。
二、基本语法
在了解了为什么选择TypeScript后,接下来学习一些TS的基础语法,此处仅罗列部分。
1、定义数据类型
//字符串
const q:string = 'string';
//数字
const w:number = 1;
//布尔值
const e:boolean = true;
//null
const r:null = null;
//undefined
const t:undefined = undefined;
2、对象类型
interface IBytedancer {
//只读属性:约束属性不可在对象初始化外赋值
readonly jobId:number;
name:string;
sex:'man' | 'woman' | 'other';
age:number;
//可读属性:定义该属性可以不存在
hobby ?: string;
//任意属性:约束所有对象属性都必须是该属性的子类型
[key:string]:any;
3、数组类型
数组类型最简单的就是用:类型+方括号表示
type IArr1 = number[];
数组泛型: 泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。
type IArr2 = Array<string | number | Record<string,number>>;
元组表示:
type IArr3 = [number,number,string,string];
接口表示:
interace IArr4 {
[key:number]:any;
}
补充类型:
①空类型:表示无赋值
type IEmptyFunction = () => void;
②任意类型:是所有类型的子类型
type IAnyType = any;
③枚举类型:支持枚举值到枚举的正、反映射
enum EnumExample {
add = '+',
mult = '*'
}
EnumExample['add'] === '+';
EnumExpamle['+'] === 'add';
三、高级类型
1、联合/交叉类型:
联合类型:IA | IB;联合类型表示一个值可以是几种类型之一。
const bookList = [{
author:'xiaoming',
type:'history',
range:'2001-2021',
},{
author:'xiaohong',
type:'story',
theme:'technology',
}]
交叉类型:IA & IB;多种类型叠加到一起成为一种类型,包含了所需的所有类型的特性。
type IBookList = Array<{
author:string;
} & ({
type:'history';
range:string;
} | {
type:'story';
theme:string;
})>
2、类型保护与类型守卫
类型守卫:定义一个函数,它的返回值是一个类型谓词,生效范围为子作用域
4、函数返回类型
关键字extends跟随泛型出现时,表示类型推断,其表达可类比三元表达式,如T === 判断类型 ?类型A : 类型B
关键字infer出现在类型推荐中,表示定义类型变量,可以用于指代类型,如将函数的返回值类型作为变量,使用新泛型R表示,使用在类型推荐命中的结果中。
四、工程应用
Web: 通过webpack进行构建
①配置webpack loader相关配置
②配置tsconfig.js文件
③运行webpack启动/打包
④loader处理ts文件时,会进行编译与类型检查
Node:使用TSC编译
①安装Node与npm
②配置tsconfig.js文件
③使用npm安装tsc
④使用tsc运行编译得到js文件