关于大前端的笔记(4)typescript
TypeScript:通过在js的基础上添加静态类型定义和基于类的面向对象编程构建而成。可以通过ts编译器或者Babel转译为JavaScript代码,可以运行在任何浏览器/操作系统上。
TypeScript从一开始就提出了自己的设计目标,主要目标如下:
(1)遵循当前及未来出现的ECMAScript规范。(2)为大型项目提供构建机制(通过Class、接口和模块等支撑)。(3)兼容现存的JavaScript代码,即任何合法的JavaScript程序都是合法的TypeScript程序。(4)对于发行版本的代码没有运行开销。使用过程可以简单划分为程序设计阶段和执行阶段。(5)成为跨平台的开发工具,TypeScript使用Apache的开源协议作为开源协议,并且能够在所有主流的操作系统上安装和执行。
基础数据类型:boolean, number, string, array, tuple, enum, any, void(声明为void的变量只能赋值为null/undefined), null, undefined, never
高级数据类型:泛型、交叉类型、联合类型
交叉类型:


联合类型:


面向对象特性:TypeScript增加了类似于C#语言的面向对象编程,提供了类、接口、抽象类、泛型的支持。
类:

方法前面加上set/get可以截取对属性的访问和设置。继承使用extends关键字。
TypeScript中的抽象类:它是提供其他类继承的基类,不能直接被实例化。用abstract关键字定义抽象类和抽象方法,抽象类中的抽象方法不包含具体实现并且必须在派生类(也就是其子类)中实现,abstract抽象方法只能放在抽象类里。通常使用抽象类和抽象方法来定义标准。
接口:
TypeScript中的接口类似于C#和Java语言中的接口概念,同时还增加了更灵活的接口类型,包括属性、函数、可索引和类等。

1.可选属性
接口中的属性或者方法可以标记为可选实现的,和C#中的可选属性一致,在一个属性后面跟着一个问号(?),标记这个属性为可选的,如代码所示。

2.readonly属性
接口中的属性可以添加只读标记readonly,添加只读属性后,表示该属性不可以再赋值了。
3.属性检查
接口的作用:限制接口实现对象严格按照接口中定义的规则进行赋值,所以使用接口可以帮助开发者进行属性检查。如下这段代码,在ts里无法通过编译。

4.接口继承
接口可以继承其他接口,与类的继承使用了相同的关键字,同时支持多重继承。

5.函数类型
接口能够描述JavaScript中对象拥有的各种各样的外形。除了可以描述带有属性的普通对象外,接口也可以描述函数类型。为了使用接口表示函数类型,需要给接口定义一个调用签名。它就像是一个只有参数列表和返回值类型的函数定义。参数列表里的每个参数都需要名字和类型。

6.索引类型
索引类型具有一个索引签名,它描述了对象索引的类型,还有相应的索引返回值类型。

7.类实现(implements)接口
与Java或C#中的接口规则一致,TypeScript能够实现接口来明确地强制一个类去符合某种契约。
TypeScript装饰器
装饰器是一种特殊类型的声明,它能够被附加到类、方法、属性或参数上,可以修改类的行为,通俗地讲装饰器就是一种方法,可以注入类、方法、属性或参数来扩展类、方法、属性或参数的功能。常见的装饰器有属性装饰器、方法装饰器、参数装饰器、类装饰器。装饰器的写法:普通装饰器(无法传参)、装饰器工厂(可传参),装饰器是ES7的标准特性之一。装饰器的执行顺序:属性>方法>方法参数>类。
1. 属性装饰器:应用到属性描述上,可以用来监视、修改、替换属性的值。传入2个参数:a.对于静态成员来讲是类的构造函数,对于实例成员来讲是类的原型对象。 b: 属性名字

2. 方法装饰器:应用到方法描述上,可以用来监视、修改或者替换方法定义。传入3个参数:a. 静态成员时,类的构造函数,实例成员时,类的原型对象 b. 方法名 c. 方法的属性描述符

3. 参数装饰器:运行时当做函数被调用。传入3个参数::a. 静态成员时,类的构造函数,实例成员时,类的原型对象 b. 方法名 c. 参数在函数参数列表中的索引。

4. 类装饰器,分为普通装饰器和装饰器工厂


模块:
模块功能主要由两个命令构成:export和import。export命令用于规定模块的对外接口,import命令用于输入,并以此向其他模块提供相应的功能。

命名空间:
命名空间:在代码量较大的情况下,为了避免各种变量命名相冲突,可将相似功能的函数、类、接口等放置到命名空间内,同Java的包、.Net的命名空间一样,TypeScript的命名空间可以将代码包裹起来,只对外暴露需要在外部访问的对象,命名空间内的对象通过export关键字对外暴露。
命名空间和模块的区别:命名空间是内部模块,主要用于组织代码,避免命名冲突;模块ts是外部模块的简称,侧重代码的复用,一个模块里可能会有多个命名空间。