TypeScript:函数式还是面向对象——2024年该如何选择?

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

一枚硬币的两面:TypeScript中的函数式与面向对象方法

\n\n

TypeScript的世界是一个奇妙的地方,融合了来自不同领域的最佳实践。你是否曾想过,为什么有些开发者使用类和继承来编写代码,而另一些则使用纯函数和组合?最重要的是:哪种方法能为你的项目带来更多益处?

\n\n

在本文中,我们不会争论哪种方法更好。我们将通过实际示例,深入分析TypeScript中的函数式编程与面向对象编程。你将了解何时应该使用类,何时应该使用高阶函数,以及如何在现代开发中找到最佳平衡点。

\n\n

TypeScript中的函数式编程是什么?

\n\n

函数式编程(FP)是一种以纯函数为主要构建块的范式。它们不改变外部状态,并且对于相同的输入始终返回相同的结果。TypeScript凭借其严格的类型系统和将函数作为数据处理的能力,对FP提供了出色的支持。

\n\n

TypeScript中FP的基本原则

\n
    \n
  • 不可变性——数据不被修改,而是重新创建
  • \n
  • 纯函数——没有副作用
  • \n
  • 组合——通过简单函数构建复杂行为
  • \n
  • 高阶函数——接受或返回其他函数的函数
  • \n
\n\n
// TypeScript中纯函数和不可变性的示例\ntype User = {\n  readonly id: number;\n  readonly name: string;\n  readonly age: number;\n};\n\nconst addYear = (user: User): User => ({\n  ...user,\n  age: user.age + 1\n});\n\nconst users: User[] = [\n  { id: 1, name: 'Alice', age: 25 },\n  { id: 2, name: 'Bob', age: 30 }\n];\n\n// 没有突变——创建新数组\nconst updatedUsers = users.map(addYear);\nconsole.log(users[0].age); // 25(原始数据未改变)\nconsole.log(updatedUsers[0].age); // 26\n
\n\n

请注意readonly——这是TypeScript的一个强大工具,有助于在类型层面维护不可变性。

\n\n

TypeScript中的面向对象编程是什么?

\n\n

面向对象编程(OOP)围绕对象构建,这些对象将数据和行为结合在一起。TypeScript为JavaScript添加了经典的继承、访问修饰符和接口,使OOP更具表现力。

\n\n

TypeScript中OOP的基本原则

\n
    \n
  • 封装——通过private和protected隐藏内部状态
  • \n
  • 继承——创建类的层次结构
  • \n
  • 多态——为不同实现提供统一接口
  • \n
  • 抽象——通过接口而非具体类进行工作
  • \n
\n\n
// TypeScript中OOP方法的示例\nabstract class Animal {\n  constructor(protected name: string) {}\n\n  abstract makeSound(): string;\n\n  public introduce(): string {\n    return `I am ${this.name}, and I say ${this.makeSound()}`;\n  }\n}\n\nclass Dog extends Animal {\n  constructor(name: string) {\n    super(name);\n  }\n\n  public makeSound(): string {\n    return 'Woof!';\n  }\n}\n\nclass Cat extends Animal {\n  constructor(name: string) {\n    super(name);\n  }\n\n  public makeSound(): string {\n    return 'Meow!';\n  }\n}\n\nconst animals: Animal[] = [new Dog('Rex'), new Cat('Whiskers')];\nanimals.forEach(a => console.log(a.introduce()));\n// I am Rex, and I say Woof!\n// I am Whiskers, and I say Meow!\n
\n\n

这里的abstract和protected是TypeScript的特性,在普通JavaScript中不存在。它们允许你在类型层面构建严格的架构。

\n\n

方法对比:何时使用哪种?

\n\n

让我们分析几个

博客

书籍推荐