我目前正在使用 Elysia 开发一个项目,我正在尝试为产品变体定义一个递归模式。我的目标是让每个变体都有孩子,这些孩子本身也可以是变体。
这是我的架构的简化版本:
import { t } from "elysia";
export const variantSchema = t.Recursive(() =>
t.Object({
_id: t.Optional(t.String()),
ref: t.String(),
name: t.String({
minLength: 1,
error: "Name must be at least 1 character long",
}),
additionalPrice: t.Number({
minimum: 0,
error: "Additional price must be at least 0",
}),
discountPrice: t.Optional(
t.Number({
minimum: 0,
error: "Discount price must be at least 0",
}),
),
currentStock: t.Number({
minimum: 0,
error: "Current stock must be at least 0",
}),
children: t.Optional(t.Array(variantSchema)), // Recursive reference
}),
);
export const saveVariants = t.Object({
productId: t.String(),
variants: t.Array(variantSchema),
});
我确保使用 t.Recursive() 来定义递归模式。 我检查了属性定义以确认它们正确引用了递归模式。 我遵循了 TypeBox 中有关递归类型的文档,但仍然遇到问题。 问题 在 Elysia 中定义递归模式时,有人遇到过类似的问题吗?可能导致 ReferenceError 的原因:初始化之前无法访问“variantSchema”。 如何正确定义递归模式而不遇到初始化错误?
问题是,您试图在已知之前在其自己的定义中使用
variantSchema
的值,因此会出现错误。 typebox的文档给出了如何使用t.Recursive
的清晰示例。一般来说,您希望使用 t.Recursive
的回调接收到的参数。
适用于您的案例:
const variantSchema = t.Recursive(This => t.Object({
children: t.Optional(t.Array(This))
}));
应该可以解决问题。 示例中名为
This
的参数指的是您当前定义的架构。