Как написать схему zod для глубоко вложенного объекта

У меня есть следующие данные:

      {
  "2022-06-01": {
    "09:00am": {
      "time_table_id": 1,
      "job_id": 4,
      "start_working_time": "09:00am",
      "end_working_time": "09:00pm",
      "work_duration": "12:00:00",
      "merchant_name": "Brands Outlet @ The Starling",
      "address2": "Jalan SS 21/37, Damansara Utama",
      "job_name": "Pro hero",
      "job_application_status": "Hired"
    }
  }
}

и это моя схема, но она дает мне ошибку zod.

      const apiScheme = z.object({
  Date: z.object({
    Time: z.object({
      date: z.string(),
      time_table_id: z.number().nullable(),
      job_id: z.number(),
      start_working_time: z.string(),
      end_working_time: z.string(),
      // work_duration: z.string(),
      // merchant_name: z.string(),
      // address2: z.string(),
      job_name: z.string(),
      job_application_status: z.string(),
    }),
  }),
});

// -- snip -- (React code):

const data = useMemo(() => {
  if (responseData) {
    const parseData = apiScheme.parse(responseData);
    //    error here ~~~~~~~~~~-^
    if (parseData) {
      return parseData;
    }
  }
  return null;
}, [responseData]);

1 ответ

Я думаю, ваша проблема в том, что вы используете тип, когда на самом деле хотите использовать .

      const apiSchema = z.record(
  z.string(), // Key type for the outer record
  z.record(
    z.string(), // Key type for the second level record
    z.object({
      time_table_id: z.number().nullable(),
      job_id: z.number(),
      start_working_time: z.string(),
      end_working_time: z.string(),
      work_duration: z.string(),
      merchant_name: z.string(),
      address2: z.string(),
      job_name: z.string(),
      job_application_status: z.string()
    }),
  ),
);

z.objectиспользуется в таких случаях, как схема для самого внутреннего объекта, где все имена полей известны и останутся прежними. z.recordиспользуется, когда у вас есть тип, подобный типу записи TypeScript, который является просто индексируемым объектом, но фактические ключи объекта неизвестны во время компиляции.


Небольшое замечание: если во время компиляции вы знаете, что значения всегда будут совпадать с датой и временем, вместо этого вы можете написать такую ​​схему:

      z.object({
  "2022-06-01": z.object({
     "09:00am": z.object({ /* ... */ }),
  },
});

но я предполагаю, что индексы «Дата» и «Время» неизвестны во время компиляции. Схема, подобная приведенной выше, также должна анализировать точную форму данных в вашем примере (но не будет работать, если даты или время будут другими).

Другие вопросы по тегам