lazyAsync
Создает ленивую схему.
const Schema = v.lazyAsync<TWrapped>(getter);
Обобщения
TWrappedextends BaseSchema<unknown, unknown, BaseIssue<unknown>> | BaseSchemaAsync<unknown, unknown, BaseIssue<unknown>>
Параметры
getter(input: unknown) => MaybePromise<TWrapped>
Объяснение
Функция getter вызывается отложенно для получения схемы. Это необходимо, чтобы получить доступ к входным данным через первый аргумент функции getter и избежать циклической зависимости в рекурсивных схемах.
Возвращаемое значение
SchemaLazySchemaAsync<TWrapped>
Примеры
В следующих примерах показано, как можно использовать lazyAsync.
Схема списка транзакций
Рекурсивная схема для проверки транзакций.
Из-за ограничения TypeScript типы входных и выходных данных рекурсивных схем нельзя вывести автоматически. Поэтому необходимо явно указать эти типы с помощью
GenericSchemaAsync.
import { isTransactionValid } from '~/api';
type Transaction = {
transactionId: string;
next: Transaction | null;
};
const TransactionSchema: v.GenericSchemaAsync<Transaction> = v.objectAsync({
transactionId: v.pipeAsync(
v.string(),
v.uuid(),
v.checkAsync(isTransactionValid, 'The transaction is not valid.')
),
next: v.nullableAsync(v.lazyAsync(() => TransactionSchema)),
});
Схема электронной почты или имени пользователя
Схема для проверки объекта, содержащего электронную почту или имя пользователя.
В большинстве случаев
unionAsyncиvariantAsync— более подходящие варианты для создания такой схемы. Рекомендую использоватьlazyAsyncтолько в особых случаях.
import { isEmailPresent, isUsernamePresent } from '~/api';
const EmailOrUsernameSchema = v.lazyAsync((input) => {
if (input && typeof input === 'object' && 'type' in input) {
switch (input.type) {
case 'email':
return v.objectAsync({
type: v.literal('email'),
email: v.pipeAsync(
v.string(),
v.email(),
v.checkAsync(
isEmailPresent,
'The email is not present in the database.'
)
),
});
case 'username':
return v.objectAsync({
type: v.literal('username'),
username: v.pipeAsync(
v.string(),
v.nonEmpty(),
v.checkAsync(
isUsernamePresent,
'The username is not present in the database.'
)
),
});
}
}
return v.never();
});
Связанные API
Следующие API можно использовать вместе с lazyAsync.
Схемы
any, array, bigint, blob, boolean, custom, date, enum, exactOptional, file, function, instance, intersect, lazy, literal, looseObject, looseTuple, map, nan, never, nonNullable, nonNullish, nonOptional, null, nullable, nullish, number, object, objectWithRest, optional, picklist, promise, record, set, strictObject, strictTuple, string, symbol, tuple, tupleWithRest, undefined, undefinedable, union, unknown, variant, void
Методы
config, getDefault, getFallback
Действия
args, base64, bic, brand, bytes, check, checkItems, codePoints, creditCard, cuid2, decimal, description, digits, domain, email, emoji, empty, endsWith, entries, everyItem, excludes, filterItems, findItem, finite, flavor, graphemes, gtValue, guard, hash, hexColor, hexadecimal, imei, includes, integer, ip, ipv4, ipv6, isbn, isrc, isoDate, isoDateTime, isoDateTimeSecond, isoTime, isoTimeSecond, isoTimestamp, isoWeek, ksuid, length, ltValue, mac, mac48, mac64, mapItems, maxBytes, maxCodePoints, maxEntries, maxGraphemes, maxLength, maxSize, maxValue, maxWords, metadata, mimeType, minBytes, minCodePoints, minEntries, minGraphemes, minLength, minSize, minValue, minWords, multipleOf, nanoid, nonEmpty, notBytes, notCodePoints, notEntries, notGraphemes, notLength, notSize, notValue, notValues, notWords, octal, parseJson, partialCheck, rawCheck, rawTransform, readonly, reduceItems, regex, returns, rfcEmail, safeInteger, size, slug, someItem, sortItems, startsWith, stringifyJson, title, toCamelCase, toKebabCase, toLowerCase, toMaxValue, toMinValue, toPascalCase, toSnakeCase, toUpperCase, transform, trim, trimEnd, trimStart, ulid, url, uuid, value, values, words
Утилиты
entriesFromList, isOfKind, isOfType
Асинхронность
arrayAsync, awaitAsync, checkAsync, customAsync, exactOptionalAsync, fallbackAsync, getDefaultsAsync, getFallbacksAsync, intersectAsync, looseObjectAsync, looseTupleAsync, mapAsync, nonNullableAsync, nonNullishAsync, nonOptionalAsync, nullableAsync, nullishAsync, objectAsync, objectWithRestAsync, optionalAsync, parseAsync, parserAsync, partialCheckAsync, pipeAsync, rawCheckAsync, rawTransformAsync, recordAsync, safeParseAsync, safeParserAsync, setAsync, strictObjectAsync, strictTupleAsync, transformAsync, tupleAsync, tupleWithRestAsync, unionAsync, variantAsync
© Fabian Hiller
Licensed under the MIT License.
https://valibot.dev/api/lazyAsync/