为什么选择 farrow-schema?
🎯 类型定义 + 运行时验证 = 一石二鸟
💡 让 bug 在编译和运行时都无处遁形
嘿!👋 如果你曾经:
- 😩 写了类型定义,还要再写一遍验证逻辑
- 🤦 API 接收到奇怪的数据,TypeScript 却无能为力
- 😭 修改数据结构要改三个地方(类型、验证、文档)
- 🥵 被产品经理的"小改动"搞到崩溃
那么,farrow-schema 就是你的救星!
痛点:传统方式的困境
假设你正在开发用户注册功能。使用传统方式,你需要:
typescript
// 1. 定义 TypeScript 接口
interface User {
name: string
email: string
age: number
}
// 2. 编写验证函数(开始怀疑人生)
function validateUser(data: any): User {
if (!data.name || typeof data.name !== 'string') {
throw new Error('Name is required and must be a string')
}
if (!data.email || !isValidEmail(data.email)) {
throw new Error('Valid email is required')
}
if (!data.age || typeof data.age !== 'number') {
throw new Error('Age is required and must be a number')
}
return data as User
}
// 3. 维护两份定义的同步... 😭
// 4. 产品经理:能不能再加个字段?
// 5. 你:...(内心崩溃)问题显而易见:
- ❌ 类型定义和验证逻辑分离,容易不一致
- ❌ 每次修改需要同步更新两处代码
- ❌ 验证代码冗长重复,难以维护
- ❌ TypeScript 类型只在编译时有效
解决方案:farrow-schema
使用 farrow-schema,生活突然美好了起来:
typescript
import { ObjectType, String, Number } from 'farrow-schema'
import { Validator } from 'farrow-schema/validator'
// 一次定义,同时拥有类型和验证
class User extends ObjectType {
name = String
email = EmailType // 自定义验证器
age = Number
}
// 自动提取 TypeScript 类型
type UserType = TypeOf<typeof User>
// { name: string, email: string, age: number }
// 运行时验证
const result = Validator.validate(User, req.body)
if (result.kind === 'Ok') {
// result.value 已通过验证,类型安全
console.log(result.value)
}优势:
- ✅ 一次定义,双重保障 - 编译时类型检查 + 运行时验证
- ✅ 类型推导 - 自动从 Schema 提取 TypeScript 类型
- ✅ 简洁优雅 - class 继承,符合 OOP 习惯
- ✅ 易于维护 - 修改一处,自动同步
