导入
带类型的类
使用清晰的类型定义和精确的访问控制,构建健壮且封装良好的 TypeScript 类。
1class User { 2 name: string; 3 email: string; 4 5 constructor(name: string, email: string) { 6 this.name = name; 7 this.email = email; 8 } 9 10 greet(): string { 11 return `你好,${this.name}!`; 12 } 13} 14 15const user = new User("Ada Lovelace", "ada@example.com"); 16console.log(user.greet());
1class BrokenTimer { 2 startTime: number; // 已声明但未初始化 3} 4 5const timer = new BrokenTimer(); 6console.log(timer.startTime); // ❌ 错误:属性 'startTime' 没有初始化器,且在构造函数中未被明确赋值。
1class Timer { 2 startTime: number = Date.now(); 3} 4 5const timer = new Timer(); 6console.log(timer.startTime); // ✅ 安全且完全初始化
1class Timer { 2 startTime: number; 3 4 constructor() { 5 this.startTime = Date.now(); 6 } 7} 8 9const timer = new Timer(); 10console.log(timer.startTime); // ✅ 安全且完全初始化
1class ReportEntry { 2 public title: string; 3 protected author: string; 4 private data: string[]; 5 6 constructor(title: string, author: string, data: string[]) { 7 this.title = title; 8 this.author = author; 9 this.data = data; 10 } 11 12 public summarize(): string { 13 return `${this.title} 由 ${this.author}`; 14 } 15 16 private cleanData(): string[] { 17 return this.data.filter(item => item.trim() !== ""); 18 } 19 20 protected getRowCount(): number { 21 return this.data.length; 22 } 23} 24 25const report = new ReportEntry("Q1 分析报告", "Jordan", ["收入", " ", "增长"]); 26console.log(report.summarize()); 27 28// console.log(report.author); // ❌ 错误:'author' 是受保护的 29// console.log(report.data); // ❌ 错误:'data' 是私有的 30// console.log(report.getRowCount()); // ❌ 错误:该方法是受保护的
1class Point { 2 constructor(public x: number, public y: number) {} 3} 4 5const p = new Point(10, 20); 6console.log(p.x); // 10
代码示例
1constructor(public x: number, public y: number) {}
1// 在此处编写你的代码
提示
- 确保所有字段都被初始化——可以在声明时直接赋值,或在构造函数中赋值。
- 使用参数属性(parameter properties)在一步内完成字段的声明与赋值。
- 使用
private限制外部对内部状态的访问。 - 通过方法安全地暴露内部数据。
- 明确为方法的参数和返回值添加类型。
解决方案
使用访问修饰符和参数属性封装良好的 Car 类
1class Car { 2 constructor(public model: string, private fuelLevel: number) {} 3 4 drive(distance: number): void { 5 this.fuelLevel -= distance * 0.1; 6 } 7 8 getFuelLevel(): number { 9 return this.fuelLevel; 10 } 11} 12 13const myCar = new Car("Mustang GT", 100); 14 15console.log(`初始油量:${myCar.getFuelLevel()}L`); 16myCar.drive(50); 17console.log(`剩余油量:${myCar.getFuelLevel()}L`); 18 19// myCar.fuelLevel = 0; // ❌ 错误:属性 'fuelLevel' 是私有的
说明:
- 第 1–2 行: 定义了一个
Car类,使用参数属性声明两个字段 ——model为public,fuelLevel为private。 - 第 4–6 行:
drive方法根据行驶距离减少燃油量。该方法参数有明确类型,无返回值。 - 第 8–10 行:
getFuelLevel方法返回当前燃油余量,其返回类型显式声明为number。 - 第 13 行: 创建一个
Car实例,型号为"Mustang GT",初始油量为100。 - 第 16 行: 调用
drive方法传入距离50,油量减少5。 - 第 17 行: 输出更新后的油量,此时为
95。 - 第 19 行: 尝试从类外部直接访问
fuelLevel会导致编译错误 —— TypeScript 强制执行private访问限制。