1.0.0 • Published 8 months ago
enhanced-validator v1.0.0
Enhanced Validator 技術文件
概述
EnhancedValidator 是一個基於 TypeScript 的驗證函式庫,提供全面的物件資料結構驗證功能。它支援巢狀物件驗證、自訂驗證規則、資料轉換,以及彈性的驗證模式。
主要特色
- 基於 TypeScript 的型別安全驗證
- 使用點記法的巢狀物件驗證
- 可擴展的驗證規則
- 自訂驗證函式
- 資料轉換功能
- 多種驗證模式(快速失敗或全部驗證)
- 豐富的內建驗證器
- 詳細的錯誤報告
基本使用方法
// 定義資料結構
interface UserData {
username: string;
email: string;
profile: {
age: number;
birthDate: string;
};
}
// 建立驗證器實例
const validator = new EnhancedValidator<UserData>();
// 設定驗證規則
validator
.field('username')
.isRequired('使用者名稱為必填')
.isString('使用者名稱必須是字串')
.matches(/^[a-zA-Z0-9_]{3,20}$/, '使用者名稱格式不正確')
.field('email')
.isRequired('電子郵件為必填')
.matches(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/, '電子郵件格式不正確')
.field('profile.age')
.isNumber('年齡必須是數字')
.isPositive('年齡必須是正數')
.field('profile.birthDate')
.isPastDate('生日必須是過去的日期');
// 驗證資料
const data = {
username: 'john_doe',
email: 'john@example.com',
profile: {
age: 25,
birthDate: '1998-01-01'
}
};
const result = await validator.validate(data);
驗證方法
基本驗證
isRequired()
: 檢查欄位是否存在且不為空notEmpty()
: 檢查字串是否不為空isString()
: 檢查是否為字串isNumber()
: 檢查是否為數字isBoolean()
: 檢查是否為布林值
日期相關驗證
isFutureDate()
: 檢查是否為未來日期isPastDate()
: 檢查是否為過去日期isWeekday()
: 檢查是否為平日isWeekend()
: 檢查是否為週末
字串相關驗證
containsLowercase()
: 包含小寫字母containsUppercase()
: 包含大寫字母containsNumber()
: 包含數字containsSpecialChar()
: 包含特殊字元isAlphanumeric()
: 僅包含字母和數字isNumericString()
: 純數字字串isSlug()
: 符合 slug 格式
檔案相關驗證
isValidFileExtension()
: 檢查檔案副檔名
數字相關驗證
isPositive()
: 檢查是否為正數isNegative()
: 檢查是否為負數
其他驗證
isBase64()
: 檢查是否為有效的 Base64 字串matches()
: 使用正則表達式驗證custom()
: 自訂驗證函式
驗證結果格式
interface ValidationResult<T> {
success: boolean; // 驗證是否成功
data?: T; // 轉換後的資料(僅在成功時存在)
errors: ValidationError[]; // 所有錯誤列表
fieldErrors: { // 依欄位分類的錯誤
[K in keyof T]?: ValidationError[];
};
}
interface ValidationError {
field: string; // 錯誤欄位
message: string; // 錯誤訊息
code?: string; // 錯誤代碼
params?: Record<string, unknown>; // 額外參數
}
進階功能
驗證模式設定
// 設定快速失敗模式(遇到第一個錯誤就停止)
validator.setValidationMode('fail-fast');
// 設定全部驗證模式(檢查所有欄位)
validator.setValidationMode('all');
資料轉換
validator
.field('age')
.isString()
.transform(value => parseInt(value as string))
.isPositive();
自訂驗證
validator
.field('password')
.custom(
value => {
const pwd = value as string;
return pwd.length >= 8 && /[A-Z]/.test(pwd);
},
'密碼必須至少8個字元且包含大寫字母'
);
最佳實踐
- 使用 TypeScript 介面定義資料結構
- 針對每個欄位提供清晰的錯誤訊息
- 適當使用驗證模式
- 善用巢狀物件驗證功能
- 需要時使用資料轉換功能
- 為複雜驗證邏輯建立自訂驗證函式
錯誤處理
const result = await validator.validate(data);
if (!result.success) {
// 處理整體錯誤
console.log('驗證錯誤:', result.errors);
// 處理特定欄位錯誤
if (result.fieldErrors.username) {
console.log('使用者名稱錯誤:', result.fieldErrors.username);
}
}
1.0.0
8 months ago