В библиотеке Yup работа со строками строится вокруг цепочки методов, которые последовательно применяют преобразования и проверки. Приведение строк к нижнему и верхнему регистру относится к стадии трансформации значения до выполнения валидации, что позволяет унифицировать входные данные и снизить вероятность ошибок при сравнении или проверке формата.
Трансформации выполняются до валидаторов (min,
max, matches и других), поэтому итоговое
значение, которое проходит проверку, уже может отличаться от исходного
пользовательского ввода.
Любая строковая схема в Yup начинается с yup.string().
На этом уровне значение ещё не модифицировано, но уже определён тип
данных. Далее к схеме могут применяться трансформации:
lowercase()uppercase()trim()transform()Трансформации выполняются в порядке объявления цепочки. Это важно, поскольку результат одного шага становится входом для следующего.
Метод lowercase() преобразует все символы строки в
нижний регистр, используя стандартную реализацию JavaScript
String.prototype.toLowerCase().
import * as yup from "yup";
const schema = yup.object({
email: yup.string().required().lowercase(),
});
При валидации значение:
"User@Example.COM"
будет преобразовано в:
"user@example.com"
и именно эта версия попадёт в результирующий объект после
validate.
matches,
email и т.д.)Метод uppercase() выполняет обратную операцию, приводя
строку к верхнему регистру через
String.prototype.toUpperCase().
const schema = yup.object({
countryCode: yup.string().length(2).uppercase(),
});
Пример входного значения:
"us"
После трансформации:
"US"
Yup выполняет цепочку слева направо. Это влияет на итоговое значение:
const schema = yup.string().trim().lowercase();
Сначала выполняется trim(), затем
lowercase():
Вход:
" HeLLo "
Результат:
"hello"
Обратный порядок даёт тот же результат в этом случае, но при более сложных трансформациях поведение может отличаться.
Метод transform() позволяет реализовать кастомную логику
преобразования, включая условия и сложные правила обработки строки.
const schema = yup.string().transform((value, originalValue) => {
if (typeof originalValue === "string") {
return originalValue.toLowerCase().replace(/\s+/g, "_");
}
return value;
});
Здесь одновременно выполняется:
Пример:
"Hello World Test"
Результат:
"hello_world_test"
Важно учитывать, что после применения lowercase() или
uppercase() валидаторы работают уже с преобразованным
значением.
const schema = yup.string()
.lowercase()
.matches(/^[a-z]+$/);
Даже если исходный ввод содержал заглавные буквы, проверка
matches будет выполняться после приведения к нижнему
регистру.
Часто преобразование регистра используется совместно с очисткой пробелов:
const schema = yup.string()
.trim()
.lowercase()
.min(3)
.max(20);
Такая комбинация обеспечивает:
Методы toLowerCase() и toUpperCase()
учитывают Unicode, однако поведение может различаться для некоторых
языков.
Особенности:
I → ı, İ →
i) может давать неожиданные результатыЭто важно учитывать при обработке интернациональных данных, особенно в глобальных приложениях.
Если в цепочке несколько раз применяются трансформации регистра, итоговым будет результат последнего вызова:
yup.string()
.lowercase()
.uppercase()
В этом случае итоговое значение будет в верхнем регистре, так как
uppercase() выполняется последним.
Преобразование регистра часто используется для нормализации данных перед сравнением:
const schema = yup.object({
username: yup.string().lowercase().required(),
});
Это позволяет гарантировать, что:
UserNameUSERNAMEusernameбудут приведены к одному виду.
При построении больших схем часто создаются базовые правила:
const baseString = yup.string().trim().lowercase();
const userSchema = yup.object({
login: baseString.min(3).max(30),
email: baseString.email().required(),
});
Такой подход обеспечивает единообразие обработки строк по всему приложению.
Несмотря на простоту методов, существуют нюансы:
EMAIL@TEST.COM, а ошибка отображается
уже на изменённом значении)lowercase() недопустимоТрансформации регистра не применяются к null и
undefined. Эти значения обрабатываются валидаторами
required() и nullable().
yup.string().lowercase().required()
undefined → ошибка requirednull → зависит от настройки
nullable()Внутренний порядок обработки можно представить как последовательность:
transform()trim(), lowercase(),
uppercase()min, max, matches,
email)Эта модель делает Yup предсказуемым инструментом нормализации и валидации строковых данных.