自定义类型转换函数应聚焦具体场景,明确输入/目标类型、转换逻辑与异常策略,避免万能函数;成功返回目标值,失败抛错或返回null/undefined并显式说明;需处理空值、时区、精度等边缘情况,并配合类型守卫提升ts安全性。

编写自定义类型转换工具函数,核心是明确输入类型、目标类型、转换逻辑和异常处理策略。不追求“万能”,而要针对具体业务场景设计清晰、可测、可维护的函数。
明确转换边界与失败策略
类型转换不是强制覆盖,而是有语义的映射。例如字符串转数字时,"123" 应成功,"abc" 应明确失败而非返回 NaN 或 0(后者易掩盖问题)。建议统一采用以下策略:
- 成功时返回目标类型的值(如 number、Date、boolean)
- 失败时抛出带上下文信息的错误(如 new TypeError(`Cannot convert "${input}" to number`)),或返回 null/undefined(需在函数名或文档中显式说明)
- 避免静默转换(如 parseInt("12px") → 12),除非业务明确需要宽松解析
按类型对齐设计函数签名
每个转换函数应聚焦单一方向,命名体现意图。常见模式如下:
- strToNum(str: string, options?: { strict?: boolean }):支持严格/宽松数字解析
- numToDate(timestamp: number | string):兼容时间戳字符串或数字
- boolToStr(value: unknown, trueStr = "true", falseStr = "false"):可配置输出字符串
-
jsonParse
(input: string): T :带泛型推导,失败时抛错
避免写一个 convert(input, targetType) 的万能函数——它难以类型推导、不易测试、逻辑易耦合。
处理常见陷阱与边缘情况
实际转换中容易忽略细节,导致线上问题:
- 空值与空白字符串:""、" "、null、undefined 是否允许?应在函数开头统一归一化或校验
- 时区与格式歧义:"2023-05-01" 在不同环境可能被解析为本地时区或 UTC,建议显式使用 new Date(Date.parse(...)) 或依赖 date-fns/parseISO 等可靠库
- 精度丢失:大整数字符串转 number 可能溢出(如 "9007199254740992" → 9007199254740992 正确,但 "9007199254740993" → 同样结果),必要时用 BigInt 或字符串保留
提供类型守卫增强 TypeScript 安全性
配合 TypeScript,可为转换函数补充类型守卫(Type Guard),让类型系统理解转换后的状态:
function isString(value: unknown): value is string {
return typeof value === 'string';
}
function strToNumSafe(input: unknown): number | null {
if (!isString(input) || input.trim() === '') return null;
const num = Number(input.trim());
return isNaN(num) ? null : num;
}
// 使用后 TypeScript 知道返回非 null 时一定是 number
const n = strToNumSafe("42");
if (n !== null) {
n.toFixed(2); // ✅ 类型安全
}











