通用语法
TypeScript 中使用关键字 class
来定义类。下面,您可以看到一个示例:
class
关键字用于定义名为 Person
的类。
该类有两个私有属性:类型名称 string
和类型年龄 number
。
构造函数是使用 constructor
关键字定义的。它将姓名和年龄作为参数并将它们分配给相应的属性。
该类有一个 public
名为 sayHi
的方法,用于记录问候消息。
要在 TypeScript 中创建类的实例,可以使用 new
关键字,后跟类名,然后使用括号 ()
。例如:
构造函数
构造函数是类中的特殊方法,用于在创建类的实例时初始化对象的属性。
可以使用以下语法重载构造函数:
在 TypeScript 中,可以定义多个构造函数重载,但只能有一个必须与所有重载兼容的实现,这可以通过使用可选参数来实现。
私有和受保护的构造函数
在 TypeScript 中,构造函数可以标记为私有或受保护,这限制了它们的可访问性和使用。
私有构造函数:只能在类本身内调用。私有构造函数通常用于以下场景:您想要强制执行单例模式或将实例的创建限制为类中的工厂方法
受保护的构造函数:当您想要创建一个不应直接实例化但可以由子类扩展的基类时,受保护的构造函数非常有用。
访问修饰符
访问修饰符 private
、protected
和 public
用于控制 TypeScript 类中类成员(例如属性和方法)的可见性和可访问性。这些修饰符对于强制封装以及建立访问和修改类内部状态的边界至关重要。
修饰符 private
仅限制对包含类中的类成员的访问。
修饰符 protected
允许访问包含类及其派生类中的类成员。
修饰符 public
提供对类成员的不受限制的访问,允许从任何地方访问它。
Get 与 Set
Getter 和 Setter 是特殊方法,允许您定义类属性的自定义访问和修改行为。它们使您能够封装对象的内部状态,并在获取或设置属性值时提供附加逻辑。在 TypeScript 中,getter 和 setter 分别使用 get
和 set
关键字定义。这是一个例子:
类中的自动访问器
TypeScript 版本 4.9 添加了对自动访问器的支持,这是即将推出的 ECMAScript 功能。它们类似于类属性,但使用”accessor”关键字声明。
自动访问器被”脱糖”为私有get访问set器,在无法访问的属性上运行。
this
在 TypeScript 中,this
关键字指的是类的方法或构造函数中的当前实例。它允许您在类自己的范围内访问和修改类的属性和方法。它提供了一种在对象自己的方法中访问和操作对象内部状态的方法。
参数属性
参数属性允许您直接在构造函数参数中声明和初始化类属性,从而避免样板代码,例如:
抽象类
抽象类在 TypeScript 中主要用于继承,它们提供了一种定义可由子类继承的公共属性和方法的方法。当您想要定义常见行为并强制子类实现某些方法时,这非常有用。它们提供了一种创建类层次结构的方法,其中抽象基类为子类提供共享接口和通用功能。
使用泛型
具有泛型的类允许您定义可以与不同类型一起使用的可重用类。
装饰器
装饰器提供了一种添加元数据、修改行为、验证或扩展目标元素功能的机制。它们是在运行时执行的函数。多个装饰器可以应用于一个声明。
装饰器是实验性功能,以下示例仅与使用 ES6 的 TypeScript 版本 5 或更高版本兼容。
对于 5 之前的 TypeScript 版本,应在您的 tsconfig.json
中使用使experimentalDecorators
或在命令行中使用 --experimentalDecorators
来启用它们(但以下示例不起作用)。
装饰器的一些常见用例包括:
- 观察属性变化。
- 观察方法调用。
- 添加额外的属性或方法。
- 运行时验证。
- 自动序列化和反序列化。
- 日志记录。
- 授权和认证。
- 错误防护。
注意:版本 5 的装饰器不允许装饰参数。
装饰器的类型:
类装饰器
类装饰器对于扩展现有类非常有用,例如添加属性或方法,或者收集类的实例。在下面的示例中,我们添加一个 toString
将类转换为字符串表示形式的方法。
属性装饰器
属性装饰器对于修改属性的行为非常有用,例如更改初始化值。在下面的代码中,我们有一个脚本将属性设置为始终大写:
方法装饰器
方法装饰器允许您更改或增强方法的行为。下面是一个简单记录器的示例:
它记录:
Getter 和 Setter 装饰器
getter 和 setter 装饰器允许您更改或增强类访问器的行为。例如,它们对于验证属性分配很有用。这是 getter 装饰器的一个简单示例:
装饰器元数据
装饰器元数据简化了装饰器在任何类中应用和利用元数据的过程。 他们可以访问上下文对象上的新元数据属性,该属性可以充当基元和对象的密钥。
可以通过”Symbol.metadata”在类上访问元数据信息。
元数据可用于各种目的,例如调试、序列化或使用装饰器的依赖项注入。
继承
继承是指一个类可以从另一个类(称为基类或超类)继承属性和方法的机制。派生类也称为子类或子类,可以通过添加新的属性和方法或重写现有的属性和方法来扩展和专门化基类的功能。
TypeScript 不支持传统意义上的多重继承,而是允许从单个基类继承。TypeScript 支持多种接口。接口可以定义对象结构的契约,类可以实现多个接口。这允许类从多个源继承行为和结构。
TypeScript 中的关键字 class
与 JavaScript 类似,通常被称为语法糖。它是在 ECMAScript 2015 (ES6) 中引入的,旨在提供更熟悉的语法,以基于类的方式创建和使用对象。然而,值得注意的是,TypeScript 作为 JavaScript 的超集,最终会编译为 JavaScript,而 JavaScript 的核心仍然是基于原型的。
静态成员
TypeScript 有静态成员。要访问类的静态成员,可以使用类名后跟一个点,而不需要创建对象。
属性初始化
在 TypeScript 中初始化类的属性有多种方法:
内嵌:
在下面的示例中,创建类的实例时将使用这些初始值。
在构造函数中:
使用构造函数参数:
方法重载
方法重载允许一个类有多个名称相同但参数类型不同或参数数量不同的方法。这允许我们根据传递的参数以不同的方式调用方法。