TypeScript入门|青训营笔记

78 阅读4分钟

这是我参与[第四届青训营]笔记创作活动的第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文件