掩码与校验
掩码负责值的外观,校验负责值是否正确。掩码不会让字母进入电话号码,但它不知道号码是否填写完整,也不知道税号的校验位是否正确。
检查掩码是否填写完整
isComplete —— 所有必填位置都已填写。isValid —— 已填写且正确(具体检查内容见 预设掩码):
ts
isComplete('+7 (999) 123-45', phone()); // false
isComplete('+7 (999) 123-45-67', phone()); // true
// filled and correct
isValid('31.02.2026', date()); // false — no such date
isValid('4111 1111 1111 1112', card()); // false — wrong check digit与 tinyval Schema 一起使用
在 preprocess 中去掉掩码 —— 之后校验并写入 data 的就是纯值:
ts
import { validate, object, string, pipe, preprocess, length, pattern, coerce } from 'tinyval';
import { unmask, isComplete } from 'tinyval-mask';
import { phone, card, money } from 'tinyval-mask/presets';
const phoneMask = phone();
const cardMask = card();
const moneyMask = money();
// the mask is removed first, then the clean value is validated
const unmasked = (m: Parameters<typeof unmask>[1]) => (v: unknown) => (v === '' || v == null ? v : unmask(String(v), m));
const Order = object({
phone: preprocess(unmasked(phoneMask), pipe(string(), length(11))),
card: preprocess(unmasked(cardMask), pipe(string(), pattern(/^\d{16,19}$/))),
amount: preprocess(unmasked(moneyMask), coerce.number()),
});
validate(Order, { phone: '+7 (999) 123-45-67', card: '4276 1234 5678 9012', amount: '1 500,50' }).data;
// { phone: '79991234567', card: '4276123456789012', amount: 1500.5 }- 空值保持为空 —— 空值规则和
optional仍然生效。 - 在服务端同样适用:掩码是纯函数,因此
unmask可以规范化以任意格式提交的电话号码。