• 作者:老汪软件技巧
  • 发表时间:2024-12-29 17:04
  • 浏览量:

TypeScript 的 class 和 ES6(JavaScript)的 class 有很多相似之处,但 TypeScript 在原生 ES6 的基础上增加了静态类型检查和一些面向对象编程的功能扩展。以下是两者的主要区别:

1. 类型系统

TypeScript 的 class 支持类型注解,而 ES6 的 class 是动态类型的。

TypeScript 示例:

class User {
  name: string; // 属性类型
  age: number;  // 属性类型
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
  greet(): string { // 方法返回值类型
    return `Hello, my name is ${this.name}`;
  }
}
const user = new User("Alice", 30);
// user.age = "thirty"; // ❌ 报错:类型 'string' 不能赋值给 'number'

ES6 示例:

class User {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  greet() {
    return `Hello, my name is ${this.name}`;
  }
}
const user = new User("Alice", 30);
user.age = "thirty"; // ✅ 不会报错

区别:

2. 访问修饰符

TypeScript 支持 public、private 和 protected 修饰符,用于控制类的成员访问权限。ES6 中没有这些修饰符。

TypeScript 示例:

class User {
  public name: string;     // 公共成员
  private age: number;     // 私有成员
  protected role: string;  // 受保护成员
  constructor(name: string, age: number, role: string) {
    this.name = name;
    this.age = age;
    this.role = role;
  }
  private getAge(): number { // 私有方法
    return this.age;
  }
}
const user = new User("Alice", 30, "admin");
console.log(user.name); // ✅ 可以访问
// console.log(user.age); // ❌ 报错:'age' 是私有属性
// console.log(user.getAge()); // ❌ 报错:'getAge' 是私有方法

ES6 示例:

class User {
  constructor(name, age, role) {
    this.name = name;
    this.age = age; // 没有真正的“私有”属性
    this.role = role;
  }
  getAge() {
    return this.age;
  }
}
const user = new User("Alice", 30, "admin");
console.log(user.name); // ✅ 可以访问
console.log(user.age);  // ✅ 仍然可以访问

区别:

3. 抽象类

TypeScript 支持 abstract 关键字来定义抽象类和抽象方法,ES6 不支持。

TypeScript 示例:

abstract class Shape {
  abstract getArea(): number; // 抽象方法,子类必须实现
}
class Circle extends Shape {
  constructor(public radius: number) {
    super();
  }
  getArea(): number {
    return Math.PI * this.radius ** 2;
  }
}
const circle = new Circle(5);
console.log(circle.getArea()); // 78.53981633974483

实证方法与规范方法的区别有_变动成本和固定成本的区别有_

ES6 示例: ES6 中只能通过抛出错误的方式模拟抽象类:

class Shape {
  getArea() {
    throw new Error("This method must be implemented by subclass");
  }
}
class Circle extends Shape {
  constructor(radius) {
    super();
    this.radius = radius;
  }
  getArea() {
    return Math.PI * this.radius ** 2;
  }
}
const circle = new Circle(5);
console.log(circle.getArea()); // 78.53981633974483

区别:

4. 接口支持

TypeScript 支持 interface,可以用来定义类的结构并强制实现,而 ES6 没有接口的概念。

TypeScript 示例:

interface Printable {
  print(): void;
}
class Document implements Printable {
  print() {
    console.log("Printing document...");
  }
}
const doc = new Document();
doc.print(); // Printing document...

ES6 示例: 在 ES6 中,接口功能需要通过注释和开发约定来模拟:

class Document {
  print() {
    console.log("Printing document...");
  }
}
const doc = new Document();
doc.print(); // Printing document...

区别:

5. 静态检查 vs 动态行为

TypeScript 的 class 更注重编译时的静态检查,而 ES6 的 class 是纯粹的运行时结构。

TypeScript 示例:

class User {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
}
const user: User = new User("Alice");
// user.age = 30; // ❌ 报错:属性 'age' 不存在

ES6 示例:

class User {
  constructor(name) {
    this.name = name;
  }
}
const user = new User("Alice");
user.age = 30; // ✅ 没有报错,动态添加属性

区别:

总结特性TypeScript 的 classES6 的 class

类型系统

静态类型,编译时检查

动态类型,运行时检查

访问修饰符

支持 public、private、protected

不支持

抽象类

支持 abstract

不支持

接口支持

支持 interface 定义和实现

不支持

运行时功能

生成的代码与 ES6 类似,但提供类型检查

只提供运行时功能

多态和继承

支持继承、接口实现(implements)和类型安全

支持继承

用途

适合复杂系统,强调类型安全,支持静态检查

适合简单场景,动态灵活

TypeScript 的 class 在保持 ES6 语法的基础上,为开发者提供了类型检查和更强的面向对象编程支持。

:《TypeScript 抽象类和接口,有什么区别》


上一条查看详情 +分页的秘密:OFFSET 性能问题与游标分页
下一条 查看详情 +没有了