【问题标题】:How to transform object to array before parsing in Zod在 Zod 中解析之前如何将对象转换为数组
【发布时间】:2023-01-24 00:36:46
【问题描述】:

我确实有一个外部 URL 端点大于2时返回字段对象数组,只有1时返回对象, 请参阅下面的 sn-p:

当字段计数为一时返回:

{
  "fields": { "fullName": "fieldFullname", "type": "fieldType" }
}

当字段多于一个时返回:

{
  "fields": [
      { "fullName": "fieldFullname", "type": "fieldType" },
      { "fullName": "fieldFullname", "type": "fieldType" }
   ]
}

目前,这是我使用 zod 的模式:

export const sObjectMetadataSchema = z.object({
  fields: z.array(metadataFieldSchema).optional()
});

export const metadataFieldSchema = z.object({
  fullName: z.string().optional(),
  type: z.string().optional(),
});

它被配置为只接受一个对象数组。当它只返回一个字段时,它会抛出一个错误:

{
  "code": "invalid_type",
  "expected": "array",
  "received": "object",
  "path": [],
  "message": "Expected array, received object"
}

我的目标是,如果它返回单个对象,它将在运行时将其转换为一个对象数组。目前正在尝试使用 transform 来实现,但仍然无法正常工作:

使用转换的初始实现:

export const sObjectMetadataSchema = z.object({
fields: z.unknown().transform((rel) => {
    return Array.isArray(rel)
        ? z.array(metadataFieldSchema).optional()
        : 'Convert the rel to Array?';
    }),
});

【问题讨论】:

    标签: reactjs typescript integration zod


    【解决方案1】:

    我没有测试过,但似乎应该可以工作:

    const FieldsSchema = z.object({
      fullName: z.string(),
      type: z.string()
    });
    
    export const sObjectMetadataSchema = z.object({
    fields: z.union([FieldsSchema, FieldsSchema.array()]).transform((rel) => {
        return Array.isArray(rel)
            ? rel
            : [rel];
        }),
    });
    

    【讨论】:

    • 我的上帝!你拯救了我的一天@Konrad,它工作得很好。谢了哥们!
    【解决方案2】:

    感谢@Konrad 的回答!

    我在打字稿中对其进行了一些改进,因此它也可以正确输入:

    const arrayFromString = <T extends ZodTypeAny>(schema: T) => {
      return z.preprocess((obj) => {
        if (Array.isArray(obj)) {
          return obj;
        } else if (typeof obj === "string") {
          return obj.split(",");
        } else {
          return [];
        }
      }, z.array(schema));
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 2012-05-13
      • 2018-02-13
      相关资源
      最近更新 更多