TL;DR У меня ошибка типа: TS PLAYGROUND
Я хочу обеспечить безопасность типов при создании схем zod. Для этого я использую тип своих данных, например этот:
type Option = { id: number };
С этим типом я знаю точные ключи, которые должна иметь моя схема объекта zod, и использую toZod, чтобы преобразовать тип number в тип z.number().
Например, вот функция для создания схемы вариантов (ts player):
type Option = { id: number };
function createOptionSchema(input: {
[K in keyof Option]: toZod<Option>["shape"][K];
}) {
const OptionSchema: toZod<Option> = z.object(input);
return OptionSchema;
}
const test1 = createOptionSchema({id: z.number()})
const test2 = createOptionSchema({id: z.number().int()})
const test3 = createOptionSchema({id: z.string()})
const test4 = createOptionSchema({name: z.number()})
const test5 = createOptionSchema({id: z.number().optional()})
В настоящее время эта функция работает только для типа Option, я хотел бы использовать одну и ту же функцию для всех моих типов данных. Итак, я сделал это:
function createSchema<T extends Record<string, unknown>>(input: {
[K in keyof T]: toZod<T>["shape"][K];
}) {
const Schema: toZod<T> = z.object(input);
return Schema;
}
Теперь я получаю эту ошибку:
Type '"shape"' cannot be used to index type 'toZod<T>'
Я пока не смог найти решения, есть идеи?
Полезные ссылки:
Я пытался заменить тип toZod на пользовательский, но не смог преобразовать типы в типы схемы zod.
Я тоже пытался использовать satisfies, но безуспешно.






Спасибо Мэтту Пококу за это.
function createSchema<
T extends Record<string, any>,
>(input: {
[K in keyof T]: z.Schema<T[K]>;
}) {
const Schema = z.object(input);
return Schema;
}