ts-pattern 如何提高代码的可读性?

2025-05-28

ts-pattern 如何提高代码的可读性?

我第一次接触 ts-pattern

几个月前,我正在审查一个客户的代码库,其中充斥着分布在多个文件中的大量 switch 语句和对象文字,这使得可读性和可维护性变得混乱。

在与我的队友 Erick 进行结对编程期间,他分享了他的屏幕并向我展示了他正在测试的一个库。

那是我第一次使用ts-pattern🤩,说实话,它真的让我大吃一惊!它的可读性和可维护性提升令人难以置信。

这是ts-pattern文档的链接

让我给你展示一些 ts-pattern 真正发挥作用的用例。我首先想到的一个问题是:我可以在任何 TypeScript 项目中使用它吗?答案是肯定的🙌。

用例

1. 替换复杂的 Switch 语句

传统的 switch 语句:

const status = "success";

let message;
switch (status) {
  case "success":
    message = "Operation was successful!";
    break;
  case "error":
    message = "There was an error.";
    break;
  default:
    message = "Unknown status.";
}
console.log(message);  // Output: Operation was successful!
Enter fullscreen mode Exit fullscreen mode

使用 ts 模式:

import { match } from 'ts-pattern';

const status = "success";

const message = match(status)
  .with("success", () => "Operation was successful!")
  .with("error", () => "There was an error.")
  .otherwise(() => "Unknown status.");

console.log(message);  // Output: Operation was successful!
Enter fullscreen mode Exit fullscreen mode

比较:

使用 ts-pattern 的可读性非常清晰,无需 break 语句,并且模式匹配直接关注 case。在 ts-pattern 中添加或删除条件更加容易,而且您无需担心在 switch case 中忘记 break 语句。

2. API 响应的对象匹配

使用对象匹配:

const apiResponse = {
  status: 200,
  data: {
    user: {
      id: 1,
      name: 'John',
    },
  },
};

let userName;
if (apiResponse.status === 200 && apiResponse.data.user.name === 'John') {
  userName = "Hello, John!";
} else {
  userName = "User not found.";
}

console.log(userName);  // Output: Hello, John!
Enter fullscreen mode Exit fullscreen mode

使用 ts 模式:

const apiResponse = {
  status: 200,
  data: {
    user: {
      id: 1,
      name: 'John',
    },
  },
};

const userName = match(apiResponse)
  .with({ status: 200, data: { user: { name: "John" } } }, () => "Hello, John!")
  .otherwise(() => "User not found.");

console.log(userName);  // Output: Hello, John!
Enter fullscreen mode Exit fullscreen mode

比较:

ts-pattern 减少了深度嵌套 if 条件的需要,使逻辑更加清晰流畅。模式匹配直接反映了对象的结构,使其更易于理解和修改。

3.状态管理

使用 switch 进行状态管理:

const appState = { status: "loading" };

let displayMessage;
switch (appState.status) {
  case "loading":
    displayMessage = "Loading...";
    break;
  case "success":
    displayMessage = "Data loaded successfully!";
    break;
  case "error":
    displayMessage = "Failed to load data.";
    break;
  default:
    displayMessage = "Unknown state.";
}

console.log(displayMessage);  // Output: Loading...
Enter fullscreen mode Exit fullscreen mode

使用 ts 模式:

const appState = { status: "loading" };

const displayMessage = match(appState.status)
  .with("loading", () => "Loading...")
  .with("success", () => "Data loaded successfully!")
  .with("error", () => "Failed to load data.")
  .otherwise(() => "Unknown state.");

console.log(displayMessage);  // Output: Loading...
Enter fullscreen mode Exit fullscreen mode

比较:

ts-pattern 通过消除重复的 case 和 break 语句来简化状态管理。随着状态数量的增加,ts-pattern 的扩展性会更好,出现逻辑错误的可能性也会更低。

通过将 switch 语句、对象字面量和传统条件语句与 ts-pattern 进行比较,可以明显看出 ts-pattern 提供了一种更优雅、更可扩展的方法。无论您是处理复杂状态、对象匹配还是验证,ts-pattern 都能减少样板代码,提高可读性,并最大限度地减少潜在错误。不妨一试。

我会尽量持续在这里发文章🤪。谢谢。

文章来源:https://dev.to/tauantcamargo/how-ts-pattern-can-improve-your-code-readability-37dd
PREV
Tauri Beta 正式发布 - 更高效、功能更强大的跨平台应用
NEXT
Node.js 事件发射器结论