不同的国家有不同的电话号码长度。我的建议是保留国家代码列表而不是自定义正则表达式。它更易于维护,并且更具可读性。所以解决方案是:
- 解析电话号码
- 如果它是有效的检查国家代码
- 如果它有效传递给下一个内置装饰器
所以我用libphonenumber-js创建了自己的装饰器
DTO 中的用法:
export class PhoneDto {
@ToPhone
@IsString({ message: 'must be a valid number' })
readonly phone!: string;
}
执行:
import { Transform } from 'class-transformer';
import { parsePhoneNumberFromString } from 'libphonenumber-js';
const validCountries = ['US', 'UK'];
export const ToPhone = Transform(
(value: any) => {
if (typeof value !== 'string') return undefined;
const parsed = parsePhoneNumberFromString(value);
if (!parsed) return undefined;
if (!validCountries.includes(parsed.country)) return undefined;
return parsed.number;
},
{ toClassOnly: true },
);
是的,这个解决方案增加了一个库,由于解析,它可能会更慢(实际上它取决于你的国家列表),但正如我之前所说,它更具可读性和可维护性。