You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中如何正确重导出命名空间并添加自定义属性?

解决Zod重导出并添加自定义属性的问题

问题分析

你尝试通过namespace重导出Zod并添加自定义方法时遇到两个核心问题:

  1. TypeScript禁止在namespace内部使用export * from这类导出声明,触发1194错误,同时ESBuild也会报语法错误
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:53:18