1、TypeScript(本文简称TS)是JavaScript的超集,TS在JS的基础上增加这些特性
| TS | JS |
|---|---|
| JavaScript的超集,用于解决大型项目的代码复杂性 | 一种脚本语言,用于创建动态网页 |
| 强类型,支持静态和动态类型 | 动态弱类型语言 |
| 可以在编译期间发现并纠正错误 | 只能在运行时发现错误 |
| 不允许改变变量的类型 | 变量可以被赋值成不同类型 |
TS的接口是为了定义对象类型,对象类型又有什么特点呢?
- 可选属性:?
- 只读属性:readonly
- 可以描述函数类型
- 可以描述自定义属性
总之接口是非常灵活的鸭子类型。
2、TS在JS的基础上以下特性:
- 增加类的修饰符,有public、private、protected修饰符。
- 抽象类:只能被继承,不能被实例化。作为基类,抽象方法必须被子类实现。
- interface约束类,使用implements关键字。
TS中方法默认是public的。
3、TS进阶
(1)联合类型 |
一个类型定义上存在多个基础类型,可以用联合类型定义。联合类型与交叉类型类似,都可以拥有多个类型的能力,区别是:联合类型一次只能一种类型;而交叉类型每次都是多个类型的合并类型。
(2)交叉类型 &
在一个对象类型上面扩展,使用交叉类型。交叉类型把几个类型的成员合并,形成一个拥有这几个类型所有成员的新类型
(3)类型断言
TypeScript 允许你覆盖它的推断,并且能以你任何你想要的方式分析它,这种机制被称为「类型断言」。TypeScript 类型断言用来告诉编译器你比它更了解这个类型,并且它不应该再发出错误。通常在迁移JS代码到TS会用断言。
(4)类型别名(type):给类型起一个别名
-
类型别名和interface的相同点:
- 都可以定义对象或函数
- 都允许继承
-
不同点:
- interface是TS用来定义对象,type是用来定义别名方便使用
- type可以定义基本类型,interface不可以
- interface可以合并重复声明,type不可以
(5)泛型
如果我定义一个print函数用来打印一个变量,我可能会传入不同类型的变量,比如number或string,如果用联合类型|,会有些麻烦且不通用,我可以使用泛型
function identity<T>(arg: T): T { return arg; }