在 Elysia 中定义递归模式的问题

问题描述 投票:0回答:1

我目前正在使用 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”。 如何正确定义递归模式而不遇到初始化错误?

typescript validation schema bun elysiajs
1个回答
0
投票

问题是,您试图在已知之前在其自己的定义中使用

variantSchema
的值,因此会出现错误。 typebox的文档给出了如何使用
t.Recursive
的清晰示例。一般来说,您希望使用
t.Recursive
的回调接收到的参数。 适用于您的案例:

const variantSchema = t.Recursive(This => t.Object({
  children: t.Optional(t.Array(This))
}));

应该可以解决问题。 示例中名为

This
的参数指的是您当前定义的架构。

© www.soinside.com 2019 - 2024. All rights reserved.