lazy
Создаёт ленивую схему.
const Schema = v.lazy<TWrapped>(getter);
Обобщённые типы
TWrappedextends BaseSchema<unknown, unknown, BaseIssue<unknown>>
Параметры
getter(input: unknown) => TWrapped
Объяснение
Функция getter вызывается лениво для получения схемы. Это необходимо, чтобы иметь доступ к входным данным через первый аргумент функции getter и избежать циклической зависимости при создании рекурсивных схем.
Из-за ограничения TypeScript типы входных и выходных данных рекурсивных схем нельзя вывести автоматически. Поэтому необходимо явно указать эти типы с помощью
GenericSchema. См. примеры ниже.
Возвращаемое значение
SchemaLazySchema<TWrapped>
Примеры
В следующих примерах показано, как можно использовать lazy.
Схема бинарного дерева
Рекурсивная схема для проверки бинарного дерева.
type BinaryTree = {
element: string;
left: BinaryTree | null;
right: BinaryTree | null;
};
const BinaryTreeSchema: v.GenericSchema<BinaryTree> = v.object({
element: v.string(),
left: v.nullable(v.lazy(() => BinaryTreeSchema)),
right: v.nullable(v.lazy(() => BinaryTreeSchema)),
});
Схема данных JSON
Схема для проверки всех возможных значений JSON.
import * as v from 'valibot';
type JsonData =
| string
| number
| boolean
| null
| { [key: string]: JsonData }
| JsonData[];
const JsonSchema: v.GenericSchema<JsonData> = v.lazy(() =>
v.union([
v.string(),
v.number(),
v.boolean(),
v.null(),
v.record(v.string(), JsonSchema),
v.array(JsonSchema),
])
);
Ленивая схема объединения
Схема для проверки дискриминируемого объединения объектов.
В большинстве случаев для создания такой схемы лучше использовать
unionиvariant. Рекомендую использоватьlazyтолько в особых случаях.
const LazyUnionSchema = v.lazy((input) => {
if (input && typeof input === 'object' && 'type' in input) {
switch (input.type) {
case 'email':
return v.object({
type: v.literal('email'),
email: v.pipe(v.string(), v.email()),
});
case 'url':
return v.object({
type: v.literal('url'),
url: v.pipe(v.string(), v.url()),
});
case 'date':
return v.object({
type: v.literal('date'),
date: v.pipe(v.string(), v.isoDate()),
});
}
}
return v.never();
});
Связанные API
Следующие API можно использовать вместе с lazy.
Схемы
any, array, bigint, blob, boolean, custom, date, enum, exactOptional, file, function, instance, intersect, 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, undefined, union, undefinedable, unknown, variant, void
Методы
assert, config, fallback, getDefault, getDefaults, getFallback, getFallbacks, is, message, parse, parser, pipe, safeParse, safeParser
Действия
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, hexadecimal, hexColor, 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
© Fabian Hiller
Licensed under the MIT License.
https://valibot.dev/api/lazy/