TypeScript | 青训营笔记

73 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

what TypeScript?

直到2020-09,三大框架(Vue,Angular,React)都支持TypeScript

why TypeScript?

1、TS(静态类型的弱类型语言)与JS(动态类型的弱类型语言)的区别

  • 动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型(变量使用之前不需要类型声明),该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。

  • 静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型。

  • 弱类型语言:某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过显性强制转换。(类似‘a’+1)。

2、静态类型的优势

  • 可读性增强:基于语法解析TSDoc,ide增强
  • 可维护性增强:在编译阶段暴露大部分错误=>多人合作的大型项目中,获得更好的稳定性和开发效率

3、TS是JS的一个超集

  • 包含兼容所有JS特性,支持共存
  • 支持渐进式引入与升级
  • TypeScript有"类"
  • TypeScript有"模块"
  • js没有重载概念,ts有可以重载
  • ts对比js基础类型上,增加了 void/元组等等

How TypeScript?

基础数据类型:

左(js),右(ts)

  • const q='string';==>const q: string='string';
  • const w=1;==>const w: number=1;
  • const e=true;==>const e: boolean=true;
  • const r=null;==>const r:null=null;
  • const t=undefined==>const t:undefined=undefined;

对象类型:

定义对象类型名称时会在名词前加"I"表示该对象是一个类型

eg:const bytedancer:IBytedancer = {}

定义类型使用interface

函数类型:

函数也支持使用interface定义类型

函数重载:

function getDate(type:'string',timestamp?: string):string;

timestamp为可缺省函数,在变量后加一个“?”则为可缺省函数

数组类型:

  • type IArr1=number[];类型+方括号表示
  • type IArr2=Array<string|number|Record<string,number>>;泛式表示
  • type IArr3=[number,number,string,string];元祖表示
  • 接口表示
interface IArr4{
     [key:number]:any;
}

IIUG5H6NS8Y2CDVTZM6BONR.png

Typescript泛式

在不定义类型时类型不确定,用target指代

泛型约束:使用extends

type IGetRepeatStringArr = 限制泛型必须

UZYUHQD20R{0MJQX2}_XWUX.png

符合字符串

泛型参数默认类型 type IGetRepeatArr<T = number> =(target:T) 默认了数据类型为number类型

字符串/数字 字面量

  • 允许指定字符串/数字必须的固定值

  • IDomTag必须为html、body、div、span中的其一

type IDomTag = 'html' | 'body' | 'div' | 'span';

  • IDomNumber必须为1、3、5、7、9中其一

type IDomNumber = 1|3|5|7|9

TypeScript 高级数据类型

1.联合交叉类型

M7TJGFECO[P%J]SMSUO@_%U.png

2.类型保护与类型守卫

42J~0S(`9{G3WB_GUSK90ZO.png

3.Merge 函数类型实现

4.函数返回值类型

image.png

5.TypeScript 工程应用

G(TEUEH5)MZQKFGJ63{NSVG.png