TypeScript中如何正确重导出命名空间并添加自定义属性?
解决Zod重导出并添加自定义属性的问题
问题分析
你尝试通过namespace重导出Zod并添加自定义方法时遇到两个核心问题:
- TypeScript禁止在
namespace内部使用export * from这类导出声明,触发1194错误,同时ESBuild也会报语法错误 enum和null是JavaScript保留字,无法直接作为变量名解构导出,导致部分Zod成员无法正常暴露
可行解决方案
方案1:对象合并(推荐,兼容ESBuild与TS类型)
通过合并Zod导出对象与自定义成员的方式,避开namespace的限制,同时显式处理保留字:
import * as zod from 'zod'; // 定义自定义验证器 const numericId = () => zod.coerce.number().int().safe(); // 合并Zod所有成员与自定义方法,显式映射保留字 export const z = { ...zod, numericId, // 对象属性允许使用保留字,直接映射Zod的对应方法 enum: zod.enum, null: zod.null } as const; // 导出完整类型,让TS能正确推导z的所有类型 export type z = typeof zod & { numericId: typeof numericId; };
方案2:扩展Zod模块类型
如果你希望直接扩展原Zod模块的导出,可通过模块声明扩展实现:
import * as zod from 'zod'; // 扩展Zod的类型声明,添加自定义方法的类型 declare module 'zod' { export interface ZodTypeNamespace { numericId: () => zod.ZodNumber; } } // 给Zod对象添加自定义方法 zod.numericId = () => zod.coerce.number().int().safe(); // 导出别名z export { zod as z };
方案说明
- 方案1无需修改原Zod模块,类型独立且清晰,完全兼容ESBuild打包,同时通过对象属性名允许使用保留字的特性,解决了
enum和null的导出问题 - 方案2直接扩展原Zod模块,适合希望全局复用扩展后的Zod的场景,但需注意不要和其他扩展Zod的代码冲突
内容的提问来源于stack exchange,提问作者Lilou Artz
相关产品推荐
相关产品推荐

