ts-pattern 用于 TypeScript:完整指南及示例
\n\nts-pattern 库为 TypeScript 带来了强大且富有表现力的模式匹配(pattern matching)机制,其灵感来源于 OCaml、Rust、Haskell 和 Scala 等语言。ts-pattern 无需冗长的 if-else 或 switch-case 链,而是允许您以声明方式描述分支逻辑,检查数据的结构和类型。这在处理代数数据类型(ADT),例如 discriminated unions(可区分联合)、可选值(Option)或结果(Result)时尤其有价值。
为什么需要它?首先,代码变得更易读且简洁。您无需通过大量检查来解析复杂的嵌套对象,而是描述所需的数据结构,库会自动找到匹配的选项。其次,ts-pattern 提供了穷尽性检查(exhaustiveness check):如果您没有处理所有可能的情况,TypeScript 会在编译阶段报错。这从根本上减少了因遗漏状态而导致的错误数量。第三,该库完全类型化,并与 TypeScript 的类型系统集成,使得重构安全且可预测。
\n\nts-pattern 不仅仅是 switch 的替代品。它是一个完整的数据分解工具,不仅可以匹配值,还可以匹配它们的类型、结构、范围甚至自定义谓词。该库广泛应用于注重可靠性和表现力的项目中:从基于 React/Redux 的前端应用到基于 Node.js 的后端服务。
\n\n安装
\n\n通过 npm(或 yarn/pnpm)包管理器安装该库。请确保您的项目使用 TypeScript 4.0 或更高版本。
\n\nnpm install ts-pattern\n\n安装后,库即可使用。无需额外的 tsconfig.json 配置。
\n\n快速入门
\n\n我们从经典示例开始——处理 HTTP 请求的结果。假设我们有一个描述数据加载状态的 discriminated union(可区分联合)。
\n\nimport { 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\n1. match(value)
\n签名: match<I, O>(value: I): Match&l