使用Zod时如何避免生成体积过大的声明文件?
解决Zod生成声明文件中类型重复的问题
以下几种方法可以有效减少Zod生成的.d.ts文件中的类型重复:
1. 显式复用导出类型定义B
如果不需要完全依赖z.infer生成B,可以直接手动复用已导出的A类型来定义B,避免类型展开重复:
import z from 'zod'; export const schemaA = z.object({ a: z.number() }); export type A = z.infer<typeof schemaA>; export const schemaB = z.object({ b: schemaA }); // 直接复用A类型定义B,替代z.infer export type B = { b: A };
生成的.d.ts中,B会直接引用A而不是重复展开{ a: number }。
2. 手动指定Zod Schema的泛型参数
Zod的ZodObject包含多个泛型参数,其中第四个参数代表输出类型。我们可以显式指定这个参数为已导出的A,让Schema的类型定义复用A:
import z from 'zod'; export const schemaA = z.object({ a: z.number() }); export type A = z.infer<typeof schemaA>; // 显式指定schemaA的输出类型为A,schemaB会复用这个类型 export const schemaB = z.object({ b: schemaA as z.ZodObject< typeof schemaA.shape, typeof schemaA.strictness, typeof schemaA.unknownKeys, A, A > }); export type B = z.infer<typeof schemaB>;
这种方式下,.d.ts中schemaB的定义会直接引用A类型,避免重复展开schemaA的结构。
3. 使用z.lazy()结合类型断言
如果存在循环引用场景(或单纯希望延迟Schema解析),可以用z.lazy()包裹Schema,并通过类型断言关联到已导出的A类型:
import z from 'zod'; export const schemaA = z.object({ a: z.number() }); export type A = z.infer<typeof schemaA>; export const schemaB = z.object({ // 延迟加载schemaA,并断言输出类型为A b: z.lazy(() => schemaA).transform((val): A => val) }); export type B = z.infer<typeof schemaB>;
该方法既解决了可能的循环引用问题,又能让.d.ts文件复用A类型,减少代码冗余。
内容的提问来源于stack exchange,提问作者dipea
相关产品推荐
相关产品推荐

