zod TypeError:无法读取未定义的属性(读取“_parse”)

bai*_*idz 5 javascript typescript zod

我有一个使用 Zod 的 Vite 库。我想解析配置,我的文件夹结构与配置对象结构类似。index.ts文件始终导出其自己目录中的所有文件以及其子目录中的所有内容,例如,export * from \'./subDir\';根文件导出“整个库”。

\n

以下设置显示了单个配置分支

\n

Stackblitz 上的示例代码

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 api\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dataSources\n|   |   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dataSource\n|   |   |   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 following\n|   |   |   |   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 computed\n|   |   |   |   |   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 followingComputedDataSourceConfigurationSchema.ts ( extends dataSourceConfigurationSchema )\n|   \xe2\x94\x82   \xe2\x94\x82   |   |   |   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.ts\n|   |   |   |   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 entity\n|   |   |   |   |   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 followingEntityDataSourceConfigurationSchema.ts ( extends leadingDataSourceConfigurationSchema )\n|   \xe2\x94\x82   \xe2\x94\x82   |   |   |   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.ts\n|   \xe2\x94\x82   \xe2\x94\x82   |   |   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.ts\n|   |   |   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 leading\n|   |   |   |   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 leadingDataSourceConfigurationSchema.ts ( extends dataSourceConfigurationSchema )\n|   \xe2\x94\x82   \xe2\x94\x82   |   |   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.ts\n|   |   |   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dataSourceConfigurationSchema.ts ( base schema )\n\xe2\x94\x82   \xe2\x94\x82   |   |   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.ts\n|   |   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dataSourcesConfigurationSchema.ts ( expects leading and array of followings )\n\xe2\x94\x82   \xe2\x94\x82   |   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.ts\n|   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 apiConfigurationSchema.ts ( expects dataSources )\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.ts\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.ts \n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 basic.test.ts\n
Run Code Online (Sandbox Code Playgroud)\n

问题是我认为我遇到了循环依赖导入。我使用 Vitest 通过测试检查了架构

\n
it(\'fails.\', () => {\n  expect(() => apiConfigurationSchema.parse({})).not.toThrow();\n});\n
Run Code Online (Sandbox Code Playgroud)\n

通过这样做我得到以下错误

\n
\n

类型错误:无法读取未定义的属性(读取\'_parse\')

\n
\n

我不想将模式合并到一个大文件中,因为子目录可能还包含此特定部分的自定义验证函数。

\n

您对如何修复此设置有任何想法吗?

\n

Dim*_*ava 3

您有循环依赖(在 2 中index.ts

// index.ts
export { apiConfigurationSchema } from './apiConfigurationSchema';
export * from './dataSources';
Run Code Online (Sandbox Code Playgroud)
// apiConfigurationSchema.ts
import { dataSourcesConfigurationSchema } from '.';
export const used = __use(dataSourcesConfigurationSchema )
Run Code Online (Sandbox Code Playgroud)

在重新导出之前导入并使用重新导出的*位置

所以,你需要解决的只是......

// index.ts
export * from './dataSources';
export { apiConfigurationSchema } from './apiConfigurationSchema';
Run Code Online (Sandbox Code Playgroud)

...只是交换两个文件中的两行

https://stackblitz.com/edit/vitest-dev-vitest-8uh3ya?file=src/api/index.ts



研究详细信息:我创建了一个文件

// a.ts
import { apiConfigurationSchema } from './src/api/apiConfigurationSchema';
apiConfigurationSchema.parse({});
Run Code Online (Sandbox Code Playgroud)

,安装tsx包,运行tsx watch a,并查找错误所在,直到修复