Как написать схему 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({ /* ... */ }),
},
});
но я предполагаю, что индексы «Дата» и «Время» неизвестны во время компиляции. Схема, подобная приведенной выше, также должна анализировать точную форму данных в вашем примере (но не будет работать, если даты или время будут другими).