Свойство «форма» недоступно при использовании дженериков с toZod

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, но безуспешно.

Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Спасибо Мэтту Пококу за это.


    function createSchema<
      T extends Record<string, any>,
    >(input: {
      [K in keyof T]: z.Schema<T[K]>;
    }) {
      const Schema = z.object(input);
    
      return Schema;
    }

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