Class
基本使用
使用关键字 class
定义类
class User {
readonly id: bigint // 只读属性
name: string
age?: number // 可选属性
private salary: number = 0 // 私有属性
// 定义构造函数
constructor(id: bigint, name: string, age: number = 0, salary?: number) {
this.id = id
this.name = name
this.age = age
this.salary = salary
}
// 定义实例方法
eat(food: string) {
console.log(`${this.name} is eating ${food}`)
}
}
// 创建类实例
const user = new User(1n, 'syen', 30, 1000)
user.eat('banana') // 打印: syen is eating banana
可见性
可见性定义了类中的字段和方法对外的可访问权限, 有三种可见性修饰符
public
公开的,无访问权限限制 (默认)protected
类内部及其子类可访问private
仅供类内部访问
如果在构造函数的参数前添加可见性修饰符, 那么这些参数将自动变为类的成员
class User {
// 构造函数: name 是类的成员
constructor(public name: string) {
this.name = name
}
}
const user = new User('John')
console.log(user.name)
继承
派生类通过关键字 extend
继承基类的所有属性和方法,并可以定义其他字段。还可以重写基类的方法
例如
// Employee 称作派生类, User 称作基类
class Employee extends User {
department: string
constructor(
id: bigint,
name: string,
age: number,
salary: number,
department: string
) {
// super 关键字调用基类的构造函数
super(id, name, age, salary)
this.department = department
}
work() {
console.log(`${this.name} is working in ${this.department}`)
}
// 重写基类的方法
eat(food: string) {
console.log(`${this.name} is eating ${food} on canteen`)
}
}
静态成员
静态成员是定义在类上的属性,而不是类的实例上。这意味着静态成员不能被类的实例访问。
class User {}
class UserList {
// 静态属性
static count: number = 0
add(user: User) {
UserList.count++
}
// 静态方法
static getCount() {
return UserList.count
}
}
const userList = new UserList()
userList.add(new User())
userList.add(new User())
userList.add(new User())
console.log(UserList.count) // 打印:3
console.log(UserList.getCount()) // 打印:3
静态成员也可以使用可见性修饰符
泛型类
定义类的时候, 还可以传入泛型
class User<T> {
data: T
update(data: T) {
this.data = data
}
}
抽象类
抽象类(abstract class
)是一种特殊的类,它不能直接实例化。但可以作为派生类的基类。抽象类中可以添加抽象属性和抽象方法
抽象属性不能设置初始值, 抽象方法不能有实现。派生类在继承抽象类后,必须实现其中的抽象属性和抽象方法
abstract class User {
abstract id: bigint // 抽象属性
abstract eat(): void // 抽象方法
sleep() {
console.log('User sleep')
}
}
// 派生类继承
class Person extends User {
id: bigint = 10n
// 实现抽象方法
eat() {
console.log('Person eat')
}
}
const p = new Person()
console.log(p.id) // 打印: 10n
p.eat() // 打印: Person eat
p.sleep() // 打印: User sleep
实现接口
类可以使用关键字 implements
去实现一个接口。这个接口定义了类必须要具备的结构。
interface IHuman {
name: string
age: number
eat: () => void
}
class Human implements IHuman {
name: string
age: number
constructor(name: string, age: number) {
this.name = name
this.age = age
}
eat() {
console.log('eat')
}
}
尽管接口也常被用来进行类型定义,但对于类实现接口来说也并不冲突。类实现了接口,也就说明了类具有接口定义的所有字段和方法。