目录
- 为什么要学TS
- TS基础
- TS进阶
1. 为什么要学TS
TS在现代工程中的应用越来越广泛。下图展示了TypeScript与JavaScript的对比:
此外,TS带来了类型安全、支持下一代JS特性、具有完善的工具链。TS不仅仅是一门语言,更是生产力工具。
TS学习资源推荐:
2. TS基础
(1)基础数据类型
TypeScript是JavaScript的超集,它为JavaScript添加了静态类型。TypeScript具有丰富的基础数据类型,包括以下几种:
- Boolean(布尔型): 布尔型表示逻辑值,可以是
true或false。 - Number(数字型): 数字型表示数值,可以是整数或浮点数。例如,
let age: number = 30;。 - String(字符串型): 字符串型表示文本数据,使用单引号或双引号括起来。例如,
let name: string = "Alice";。 - Array(数组): 数组表示一组相同类型的值的有序集合。可以使用数组泛型或使用类型加方括号的语法来声明数组类型。例如,使用泛型:
let numbers: Array<number> = [1, 2, 3];或者使用类型加方括号:let colors: string[] = ["red", "green", "blue"];。 - Tuple(元组): 元组表示一个固定长度和类型的数组。每个元素的类型可以不同。例如,
let person: [string, number] = ["Alice", 30];表示一个包含名字和年龄的元组。 - Enum(枚举): 枚举表示一组具有命名值的常量。可以为每个枚举成员指定一个值,默认使用数字值。
- Any(任意类型): 任意类型表示可以是任何类型的值,类似于普通的JavaScript变量。任意类型的值可以在编译时和运行时更改类型。例如,
let data: any = 10;。 - Void(无类型): 无类型表示没有任何类型的值,通常用于表示函数没有返回值。
- Null 和 Undefined(空和未定义): null表示一个空值,undefined表示一个未定义的值。在默认情况下,它们是所有类型的子类型。
(2)类
在TypeScript中,类是一种面向对象的编程方式,它具有以下几个特点:
- 封装性(Encapsulation): 类通过将相关的变量和方法封装在一起,形成一个独立的实体。类可以定义公共的方法和属性,以及私有的方法和属性。私有的方法和属性只能在类内部访问,而公共的方法和属性可以在类的实例或其他地方进行访问。
- 继承性(Inheritance): 类可以通过继承关系构建层次结构。一个类可以继承另一个类的属性和方法,并可以添加或覆盖父类的行为。继承能够提供代码重用和扩展性。
- 多态性(Polymorphism): 多态性是指对象能够根据上下文的不同而表现出不同的行为。在TypeScript中,多态性可以通过方法重写和方法重载来实现。方法重写(Override)允许子类覆盖父类的实现,而方法重载(Overload)允许在一个类中定义多个同名的方法,但参数类型和个数不同。
- 访问修饰符(Access Modifiers): TypeScript提供了访问修饰符来控制类成员的可访问性。常用的访问修饰符有公共(public)、私有(private)和受保护(protected)。公共成员可以在类的实例、子类和其他地方访问,私有成员只能在类内部访问,受保护成员可以在类及其子类中访问。
- 构造函数(Constructor): 类可以定义构造函数,用于创建和初始化类的实例。构造函数在使用
new关键字创建对象时自动调用,可以接受参数用于初始化对象的属性。 - 抽象类和接口(Abstract Class and Interface): TypeScript支持抽象类和接口的概念。抽象类是不能直接实例化的类,用于作为其他类的基类。抽象类可以包含抽象方法,子类必须实现这些抽象方法。接口定义了一组方法和属性的契约,用于描述类应该具有的结构。类可以实现一个或多个接口来强制类遵循特定的行为规范。
- 静态成员(Static Members): 类可以定义静态成员,这些成员与类本身关联,而不是与类的实例关联。静态成员可以通过类名直接访问,而不需要创建类的实例。
3. TS进阶
(1)高级类型
- 联合类型
在TypeScript中,联合类型(Union Types)是一种用于声明变量、参数或函数返回值的类型注解。它允许一个值具有多个可能的类型。使用联合类型可以在不丢失类型信息的情况下,更灵活地定义变量或参数的类型。
联合类型使用竖线 | 分隔多个类型,表示该值可以是其中任意一个类型。例如, number | string 表示一个值可以是数字类型或字符串类型。当我们对一个联合类型的值进行操作时,只能使用所有类型共有的属性和方法,因为并不确定具体是哪个类型。
- 交叉类型
在TypeScript中,交叉类型(Intersection Types)是一种将多个类型组合成一个类型的方式。通过使用交叉类型,我们可以创建一个包含多个类型特性的新类型,它具有所有类型的属性和方法。例如, typeA & typeB 表示一个同时具有类型A和类型B特征的类型。使用交叉类型可以实现类型的合并,适用于需要组合多个类型的情况,提供了更灵活和细粒度的类型定义。
- 类型断言
在TypeScript中,类型断言(Type Assertion)允许通过手动指定变量或表达式的类型来告诉编译器我们对类型的了解比它更准确。类型断言有两种形式,一种是使用尖括号语法 <Type> ,另一种是使用as关键字 value as Type 。类型断言可以用于解决编译器无法确定或错误地推断出类型的情况,提供了一种显式指定类型的方式。然而,需要谨慎使用类型断言,确保断言的类型是正确的,以避免潜在的类型错误。
- 类型别名
在TypeScript中,类型别名是一种自定义类型的方式,它允许我们为现有的类型创建一个新的名称。通过使用类型别名,我们可以简化复杂的类型或为常用类型创建更有意义的名称。这有助于提高代码的可读性和维护性。使用 type 关键字可以定义类型别名,然后可以像使用任何其他类型一样使用它们。类型别名可以用于基本类型、联合类型、交叉类型等各种类型。它是TypeScript中一项强大而灵活的特性,可帮助我们编写更清晰和易于理解的代码。
(2)泛型
在TypeScript中,泛型是一种参数化类型的机制,允许我们编写可重用的代码,同时保持类型的灵活性。通过使用泛型,我们可以定义函数、类或接口,使其能够与不同类型的数据一起工作,而不是固定于特定的类型。泛型通过使用占位符类型参数来实现,这些参数在使用时被实际的类型替换。这样,我们可以在编译时捕捉到类型错误,并在不同的场景下重用同一段代码,提高了代码的可维护性和可重用性。泛型的引入使得TypeScript更加灵活和类型安全,使开发者能够编写更加通用和健壮的程序。