我有一个使用Vitest和Zod的Vite库。给定以下文件夹结构
.
├── src
│ ├── leading
│ │ ├── index.ts ( 2 )
│ │ └── leadingDataSourceConfigurationSchema.ts
│ ├── index.ts ( 1 )
│ └── dataSourceConfigurationSchema.ts
└── test
└── my.spec.ts
我为数据源创建了一个基本模式
import { z } from 'zod';
const dataSourceConfigurationSchema = z.object({
id: z.string().min(1)
}).strict();
export { dataSourceConfigurationSchema };
由索引导出。Ts (1)
export * from "./leading";
export { dataSourceConfigurationSchema } from "./dataSourceConfigurationSchema";
我还有一个扩展上面那个
的模式import { z } from 'zod';
import { dataSourceConfigurationSchema } from '..';
const leadingDataSourceConfigurationSchema = dataSourceConfigurationSchema.extend({
entityTypeId: z.string().min(1),
}).strict();
export { leadingDataSourceConfigurationSchema };
索引。Ts(2)只导出这个模式
export { leadingDataSourceConfigurationSchema } from "./leadingDataSourceConfigurationSchema";
当创建像这样的测试文件时
import { describe, it, expect } from 'vitest';
import { ZodError } from 'zod';
import { leadingDataSourceConfigurationSchema } from '../src';
describe('test', () => {
it('fails.', () => {
expect(() => leadingDataSourceConfigurationSchema.parse({})).toThrow(ZodError);
});
});
测试失败,显示以下错误消息
TypeError: Cannot read properties of undefined (reading 'extend')
这个问题可能与
有关- https://github.com/colinhacks/zod/issues/1193
- https://github.com/vitest-dev/vitest/issues/654
替换导入
时import {datasourcecconfigurationschema} from '. ';
import {datasourcecconfigurationschema} from '../datasourcecconfigurationschema ';
测试通过。所以看起来项目正在与循环依赖关系作斗争?
子目录必须直接导入文件还是我可以用不同的方法解决这个问题?
是的,您有一个循环依赖,并且由于导入顺序,dataSourceConfigurationSchema
将在leadingDataSourceConfigurationSchema
初始化时尚未初始化。这不是zod或vite的问题(尽管使用适当的ES6模块实现,您将获得TDZ错误,而不是访问undefined
上的方法的引用错误)。
dataSourceConfigurationSchema
来修复这个问题。t而不是from../index。ts,导入leadingdatasourcecconfigurationschema的模块。ts。另一个解决方案是改变src/index中的导入顺序。ts
export { dataSourceConfigurationSchema } from "./dataSourceConfigurationSchema";
export * from "./leading";
但是这很脆弱,所以我不建议这么做。