zod 类型错误:无法读取未定义的属性(读取"扩展")



我有一个使用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上的方法的引用错误)。

如您所见,您可以通过直接从../datasourcecconfigurationschema导入dataSourceConfigurationSchema来修复这个问题。t而不是from../index。ts,导入leadingdatasourcecconfigurationschema的模块。ts

。另一个解决方案是改变src/index中的导入顺序。ts

export { dataSourceConfigurationSchema } from "./dataSourceConfigurationSchema";
export * from "./leading";

但是这很脆弱,所以我不建议这么做。

相关内容

  • 没有找到相关文章

最新更新