跳到主要内容

TypeScript 构造函数

构造函数是 TypeScript 中一个非常重要的概念,它用于创建和初始化类的实例。通过构造函数,我们可以在创建对象时为其设置初始状态或执行一些必要的操作。本文将详细介绍 TypeScript 构造函数的使用方法,并通过实际案例帮助你更好地理解这一概念。

什么是构造函数?

构造函数是类中的一个特殊方法,它在创建类的实例时自动调用。构造函数的名称必须与类名相同,并且没有返回类型(即使是 void 也不允许)。构造函数的主要作用是初始化对象的属性或执行一些必要的设置。

基本语法

在 TypeScript 中,构造函数的定义如下:

typescript
class MyClass {
// 构造函数
constructor() {
// 初始化代码
}
}

示例:简单的构造函数

让我们从一个简单的例子开始,定义一个 Person 类,并在构造函数中初始化 nameage 属性:

typescript
class Person {
name: string;
age: number;

constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}

const person = new Person("Alice", 30);
console.log(person.name); // 输出: Alice
console.log(person.age); // 输出: 30

在这个例子中,Person 类的构造函数接受两个参数:nameage,并将它们分别赋值给类的属性 this.namethis.age。当我们使用 new Person("Alice", 30) 创建 Person 类的实例时,构造函数会自动调用并初始化这些属性。

构造函数的参数

构造函数可以接受任意数量的参数,这些参数用于初始化对象的属性。你可以根据需要定义不同类型的参数,包括可选参数和默认参数。

可选参数

在 TypeScript 中,你可以通过在参数名后添加 ? 来定义可选参数。可选参数在调用构造函数时可以省略。

typescript
class Person {
name: string;
age?: number;

constructor(name: string, age?: number) {
this.name = name;
this.age = age;
}
}

const person1 = new Person("Alice");
const person2 = new Person("Bob", 25);

console.log(person1.age); // 输出: undefined
console.log(person2.age); // 输出: 25

在这个例子中,age 是一个可选参数。当我们创建 person1 时,没有传递 age 参数,因此 person1.age 的值为 undefined

默认参数

你还可以为构造函数的参数设置默认值。如果调用构造函数时没有传递该参数,则会使用默认值。

typescript
class Person {
name: string;
age: number;

constructor(name: string, age: number = 18) {
this.name = name;
this.age = age;
}
}

const person1 = new Person("Alice");
const person2 = new Person("Bob", 25);

console.log(person1.age); // 输出: 18
console.log(person2.age); // 输出: 25

在这个例子中,age 参数的默认值为 18。当我们创建 person1 时,没有传递 age 参数,因此 person1.age 的值为 18

构造函数的重载

TypeScript 支持构造函数的重载,这意味着你可以定义多个构造函数签名,但只能有一个实现。构造函数的重载允许你根据不同的参数类型或数量来初始化对象。

示例:构造函数重载

typescript
class Person {
name: string;
age: number;

constructor(name: string, age: number);
constructor(name: string);
constructor(name: string, age?: number) {
this.name = name;
this.age = age ?? 18; // 如果 age 为 undefined,则使用默认值 18
}
}

const person1 = new Person("Alice");
const person2 = new Person("Bob", 25);

console.log(person1.age); // 输出: 18
console.log(person2.age); // 输出: 25

在这个例子中,我们定义了两个构造函数签名:一个接受 nameage 参数,另一个只接受 name 参数。实际的构造函数实现中,我们使用 age ?? 18 来处理 ageundefined 的情况。

实际应用场景

构造函数在实际开发中有广泛的应用。以下是一些常见的场景:

1. 初始化对象属性

构造函数最常见的用途是初始化对象的属性。例如,在创建一个用户对象时,你可能需要初始化用户的姓名、年龄、邮箱等信息。

typescript
class User {
name: string;
age: number;
email: string;

constructor(name: string, age: number, email: string) {
this.name = name;
this.age = age;
this.email = email;
}
}

const user = new User("Alice", 30, "alice@example.com");
console.log(user.email); // 输出: alice@example.com

2. 执行初始化逻辑

除了初始化属性,构造函数还可以执行一些初始化逻辑。例如,在创建一个订单对象时,你可能需要生成一个唯一的订单号。

typescript
class Order {
orderId: string;
items: string[];

constructor(items: string[]) {
this.orderId = this.generateOrderId();
this.items = items;
}

private generateOrderId(): string {
return `ORDER-${Math.random().toString(36).substr(2, 9)}`;
}
}

const order = new Order(["item1", "item2"]);
console.log(order.orderId); // 输出: 类似 "ORDER-abc123def"

3. 依赖注入

在大型应用程序中,构造函数常用于依赖注入。通过构造函数传递依赖项,可以使代码更易于测试和维护。

typescript
class UserService {
private userRepository: UserRepository;

constructor(userRepository: UserRepository) {
this.userRepository = userRepository;
}

getUser(id: number) {
return this.userRepository.getUserById(id);
}
}

class UserRepository {
getUserById(id: number) {
// 模拟从数据库获取用户
return { id, name: "Alice" };
}
}

const userRepository = new UserRepository();
const userService = new UserService(userRepository);

const user = userService.getUser(1);
console.log(user); // 输出: { id: 1, name: "Alice" }

总结

构造函数是 TypeScript 中用于创建和初始化对象的重要工具。通过构造函数,我们可以在创建对象时设置初始状态、执行初始化逻辑或注入依赖项。本文介绍了构造函数的基本语法、参数处理、重载以及实际应用场景,帮助你更好地理解和使用构造函数。

附加资源与练习

  • 练习 1: 创建一个 Car 类,包含 brandmodelyear 属性,并在构造函数中初始化这些属性。
  • 练习 2: 修改 Car 类,使其构造函数支持可选参数 year,并设置默认值为当前年份。
  • 练习 3: 创建一个 BankAccount 类,包含 accountNumberbalance 属性,并在构造函数中生成唯一的 accountNumber

通过完成这些练习,你将更深入地掌握 TypeScript 构造函数的使用方法。祝你学习愉快!