ts-pattern 用于 TypeScript:完整指南及示例

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

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

开始课程

ts-pattern 用于 TypeScript:完整指南及示例

\n\n

ts-pattern 库为 TypeScript 带来了强大且富有表现力的模式匹配(pattern matching)机制,其灵感来源于 OCaml、Rust、Haskell 和 Scala 等语言。ts-pattern 无需冗长的 if-else 或 switch-case 链,而是允许您以声明方式描述分支逻辑,检查数据的结构和类型。这在处理代数数据类型(ADT),例如 discriminated unions(可区分联合)、可选值(Option)或结果(Result)时尤其有价值。

\n\n

为什么需要它?首先,代码变得更易读且简洁。您无需通过大量检查来解析复杂的嵌套对象,而是描述所需的数据结构,库会自动找到匹配的选项。其次,ts-pattern 提供了穷尽性检查(exhaustiveness check):如果您没有处理所有可能的情况,TypeScript 会在编译阶段报错。这从根本上减少了因遗漏状态而导致的错误数量。第三,该库完全类型化,并与 TypeScript 的类型系统集成,使得重构安全且可预测。

\n\n

ts-pattern 不仅仅是 switch 的替代品。它是一个完整的数据分解工具,不仅可以匹配值,还可以匹配它们的类型、结构、范围甚至自定义谓词。该库广泛应用于注重可靠性和表现力的项目中:从基于 React/Redux 的前端应用到基于 Node.js 的后端服务。

\n\n

安装

\n\n

通过 npm(或 yarn/pnpm)包管理器安装该库。请确保您的项目使用 TypeScript 4.0 或更高版本。

\n\n
npm install ts-pattern
\n\n

安装后,库即可使用。无需额外的 tsconfig.json 配置。

\n\n

快速入门

\n\n

我们从经典示例开始——处理 HTTP 请求的结果。假设我们有一个描述数据加载状态的 discriminated union(可区分联合)。

\n\n
import { match } from 'ts-pattern';\n\n// 定义可能的状态\ntype State =\n  | { status: 'idle' }\n  | { status: 'loading' }\n  | { status: 'success'; data: string }\n  | { status: 'error'; error: Error };\n\n// 根据状态返回文本的函数\nfunction getStatusMessage(state: State): string {\n  return match(state)\n    .with({ status: 'idle' }, () => '等待中...')\n    .with({ status: 'loading' }, () => '加载中...')\n    .with({ status: 'success' }, ({ data }) => `数据:${data}`)\n    .with({ status: 'error' }, ({ error }) => `错误:${error.message}`)\n    .exhaustive(); // 检查所有情况是否都已处理\n}\n\n// 使用示例\nconsole.log(getStatusMessage({ status: 'idle' })); // "等待中..."\nconsole.log(getStatusMessage({ status: 'loading' })); // "加载中..."\nconsole.log(getStatusMessage({ status: 'success', data: '你好,世界!' })); // "数据:你好,世界!"\nconsole.log(getStatusMessage({ status: 'error', error: new Error('404') })); // "错误:404"
\n\n

此示例展示了核心思想:我们将 state 对象与不同的模式进行匹配。每个模式都是对象结构的部分描述。如果结构匹配,则执行相应的函数。.exhaustive() 方法确保我们没有遗漏处理任何一个选项。

\n\n

主要方法和函数

\n\n

该库提供了几个关键函数和方法。让我们详细了解一下。

\n\n

1. match(value)

\n

签名: match<I, O>(value: I): Match&l

推荐