optionalAsync
Создаёт необязательную схему.
const Schema = v.optionalAsync<TWrapped, TDefault>(wrapped, default_);
Обобщённые типы
TWrappedextends BaseSchema<unknown, unknown, BaseIssue<unknown>> | BaseSchemaAsync<unknown, unknown, BaseIssue<unknown>>TDefaultextends DefaultAsync<TWrapped, undefined>
Параметры
wrappedTWrappeddefault_TDefault
Пояснение
С помощью optionalAsync проверка вашей схемы будет успешно проходить для входных данных undefined, а если указать входное значение default_, схема будет использовать его, если входное значение равно undefined. Поэтому тип выходного значения может отличаться от входного типа схемы.
Важно: При использовании в схемах объектов, если ключ отсутствует и значение
default_не задано, конвейер схемы (включая преобразования) не будет выполнен. Чтобы конвейер выполнялся для отсутствующих ключей, задайте значениеdefault_.Обратите внимание, что
optionalAsyncне принимаетnullв качестве входных данных. Если нужно принимать входные данныеnull, используйтеnullableAsync, а если нужно принимать входные данныеnullиundefined, используйте вместо этогоnullishAsync. Кроме того, если нужно задать выходное значение по умолчанию для любых некорректных входных данных, используйте вместо этогоfallbackAsync.
Возвращает
SchemaOptionalSchemaAsync<TWrapped, TDefault>
Примеры
В следующих примерах показано, как можно использовать optionalAsync.
Схема необязательного имени пользователя
Схема, принимающая уникальное имя пользователя или undefined.
Если в качестве параметра
default_передать функцию, при каждом равномundefinedвходном значении схема будет возвращать уникальное имя пользователя, полученное при вызове функции.
import { getUniqueUsername, isUsernameUnique } from '~/api';
const OptionalUsernameSchema = v.optionalAsync(
v.pipeAsync(
v.string(),
v.nonEmpty(),
v.checkAsync(isUsernameUnique, 'The username is not unique.')
),
getUniqueUsername
);
Схема нового пользователя
Схема для проверки данных нового пользователя.
import { isEmailUnique, isUsernameUnique } from '~/api';
const NewUserSchema = v.objectAsync({
email: v.pipeAsync(
v.string(),
v.email(),
v.checkAsync(isEmailUnique, 'The email is not unique.')
),
username: v.optionalAsync(
v.pipeAsync(
v.string(),
v.nonEmpty(),
v.checkAsync(isUsernameUnique, 'The username is not unique.')
)
),
password: v.pipe(v.string(), v.minLength(8)),
});
/*
The input and output types of the schema:
{
email: string;
password: string;
username?: string | undefined;
}
*/
Извлечение необязательной схемы
Используйте unwrap, чтобы отменить действие optionalAsync.
import { isUsernameUnique } from '~/api';
const UsernameSchema = v.unwrap(
// Assume this schema is from a different file and is reused here
v.optionalAsync(
v.pipeAsync(
v.string(),
v.nonEmpty(),
v.checkAsync(isUsernameUnique, 'The username is not unique.')
)
)
);
Необязательная асинхронная схема с конвейерами
При использовании optionalAsync в pipeAsync действия конвейера выполняются только при наличии значения default_ или если ключ присутствует. Это относится ко всем действиям конвейера, включая transformAsync, checkAsync и другие.
const SchemaWithoutDefault = v.objectAsync({
isActive: v.pipeAsync(
v.optionalAsync(v.string()),
v.transformAsync(async (value) => value === 'true') // Does not run for missing keys
),
}); // Output type: { isActive?: boolean }
const SchemaWithDefault = v.objectAsync({
isActive: v.pipeAsync(
v.optionalAsync(v.string(), 'false'), // Default value provided
v.transformAsync(async (value) => value === 'true') // Runs for missing keys too
),
}); // Output type: { isActive: boolean }
Связанные API
Следующие API можно использовать вместе с optionalAsync.
Схемы
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, unwrap
Действия
brand, check, description, flavor, guard, metadata, partialCheck, rawCheck, rawTransform, readonly, title, transform
Утилиты
entriesFromList, isOfKind, isOfType
Асинхронные API
arrayAsync, awaitAsync, checkAsync, customAsync, exactOptionalAsync, fallbackAsync, getDefaultsAsync, getFallbacksAsync, intersectAsync, lazyAsync, looseObjectAsync, looseTupleAsync, mapAsync, nonNullableAsync, nonNullishAsync, nonOptionalAsync, nullableAsync, nullishAsync, objectAsync, objectWithRestAsync, parseAsync, parserAsync, partialCheckAsync, pipeAsync, rawCheckAsync, rawTransformAsync, recordAsync, safeParseAsync, safeParserAsync, setAsync, strictObjectAsync, strictTupleAsync, transformAsync, tupleAsync, tupleWithRestAsync, undefinedableAsync, unionAsync, variantAsync
© Fabian Hiller
Licensed under the MIT License.
https://valibot.dev/api/optionalAsync/