я API условным await axios.get<MyReturnType>("/entity") — возвратное значение get-а будет Promise<MyReturnType> с точки зрения TS, но может быть каким угодно IRL (может, вместо сервиса висит затычка, отвечающая HTTP 200 вообще на все запросы).
В простом случае я могу скормить содержимое респонса конструктору модельки, используемой в TS-коде. А для, скажем, массивов что делать? if (typeof response.data !== "array") { throw ... }?
У меня всегда ответ от сервера — Promise<unknown> есть схема const userSchema = yup.object({ id: yup.number(), name: yup:string(), }) type User = yup.InferType<userSchema> const getUser = get('/user') .then(unknown => userSchema.validate(unknown)) При вызове getUser я получу либо статически типизированного юзера, либо ошибку валидации (которую соответствующим образом обработаю и не дам статически типизированному коду работать с непонятно чем). Кроме yup есть io-ts, runtypes и ещё какие-то решения.
Годно, спасибо.
Тут на днях упоминался zod И zod прекрасен
https://github.com/colinhacks/zod Этот?
Да
А он умеет в асинхронную валидацию?
Сколько же этих либ уже наделали? superstruct, runtypes, io-ts, typed contracts
Нужно больше, пока команда TS не решит, что пора вмешаться и ввести стандартные интерфейсы >:D
Просто обернуть в промис недостаточно или я что-то не понимаю?
let asyncJimmySchema = yup.string().test( 'is-jimmy', '${path} is not Jimmy', async (value, testContext) => (await fetch('/is-jimmy/' + value)).responseText === 'true', }); await schema.isValid('jimmy'); // => true await schema.isValid('john'); // => false https://github.com/jquense/yup#mixedtestname-string-message-string--function-test-function-schema
Не, все эти валидаторы синхронные, для асинхронна нужно ручками писать то что ты написал.
А, речь про кастомные функции валидации. Спасибо, не сразу понял.
Yup по этому и юзают в формах
Кастомные там есть. Кастомных асинхронных нет
Сейчас дочитал, что умеет промисы проверять. Проверяет, что значение - промис, потом дожидается разрешения промиса, проверяет содержимое, и возвращает промис с значением либо ошибкой валидации
Не то
Да
Как?
Если нужно сделать запрос дабы что/то провалидировать, то там refine умеет принимать асинхронные функции Если нужно делать сам парсинг асинхронно, то там есть методы parseAsync и safeParceAsync
Сверь версию с версией в документации
версию чего? я сделал npm i zod, взял latest да и нет в документации parseAsync и safeParseAsync
Дока по умолчанию идет на zod3, а он в альфе При npm i zod устанавливается zod 1
Странненько
да, с альфой работает странненько, что документация по умолчанию описывает не номерную версию
Обычно об этом дисклеймер есть
хотяяяяя…… нет, дока по умолчанию на latest версию
Не, там в ридми пишется zod 3 и потом дока Если переключить ветку на мастер, там будет дока для лэйтест
Обсуждают сегодня