Комбинирование различных типов данных

Библиотека Cleave.js предоставляет механизм форматирования ввода, который изначально ориентирован на работу с отдельными типами данных: номера телефонов, числовые значения, даты, кредитные карты. Однако реальная прикладная разработка почти всегда требует работы с составными полями, где в одном значении сочетаются разные типы данных, правила форматирования и контексты обработки.

Комбинирование типов данных в Cleave.js реализуется через гибкую архитектуру масок, кастомных обработчиков и динамических стратегий форматирования. Основная идея заключается в том, что одно поле ввода может одновременно подчиняться нескольким правилам, переключаться между ними или применять их последовательно в зависимости от состояния значения.


Архитектурная модель комбинирования

Внутренне Cleave.js разделяет форматирование на несколько уровней:

  • Парсинг ввода — разбор исходной строки
  • Применение маски — наложение правил форматирования
  • Рендеринг значения — отображение пользователю
  • Синхронизация состояния — поддержка неизменяемого «сырого» значения

Комбинирование типов данных происходит на уровне маски и логики трансформации. Основной механизм — это объединение конфигураций через:

  • blocks
  • delimiter
  • numericOnly
  • prefix
  • noImmediatePrefix
  • rawValueTrimPrefix
  • prefixStripped
  • кастомный formatter

Каждый из этих элементов может быть использован как часть композиции нескольких типов данных.


Составные маски: объединение блоков

Наиболее прямой способ комбинирования типов данных — использование blocks, где каждая часть строки получает собственное правило.

Пример концепции:

  • первые символы — код страны (буквы)
  • далее — числовой идентификатор
  • затем — контрольная дата

Такой формат задаётся через блоки разной длины:

new Cleave('.input', {
    blocks: [2, 4, 2, 2],
    delimiter: '-'
});

Хотя пример кажется числовым, та же модель применяется для смешанных данных:

  • буквенные блоки
  • числовые блоки
  • фиксированные сегменты

Важное свойство блоковой модели

Блоки не привязаны к типу данных. Это означает, что Cleave.js не различает «строку», «число» или «код» — он оперирует только сегментами символов.


Смешение числовых и строковых форматов

Комбинирование букв и цифр требует использования кастомной логики, поскольку стандартные настройки numericOnly ограничивают тип данных.

Типичный подход:

  • отключение жёсткой числовой фильтрации
  • использование кастомного форматтера
  • постобработка значения

Пример логики:

new Cleave('.input', {
    delimiter: '',
    blocks: [3, 3, 4],
    uppercase: true
});

Здесь происходит фактическое смешение:

  • первые 3 символа — буквы
  • следующие 3 — цифры
  • последние 4 — идентификатор

Cleave.js не валидирует тип символов внутри блоков, поэтому комбинирование достигается структурированием, а не строгой типизацией.


Динамическое переключение форматов

Одной из ключевых возможностей при комбинировании типов данных является динамическое изменение конфигурации.

Пример сценария:

  • пользователь вводит номер карты → активируется формат карты
  • пользователь переключается на IBAN → активируется другой формат
  • пользователь вводит телефон → применяется телефонная маска

Это реализуется через переинициализацию экземпляра или обновление конфигурации:

cleave.setRawValue('');
cleave.properties.blocks = [4, 4, 4, 4];
cleave.properties.delimiter = ' ';

Принцип работы динамики

  • Cleave.js не хранит «тип поля» как фиксированную сущность
  • формат определяется текущей конфигурацией
  • смена конфигурации равнозначна смене модели данных

Комбинирование телефонных и числовых форматов

Телефонные номера часто содержат комбинацию:

  • код страны (число)
  • код оператора
  • основной номер

При этом возможны дополнительные элементы:

  • скобки
  • пробелы
  • дефисы

Конфигурация:

new Cleave('.phone', {
    phone: true,
    phoneRegionCode: 'RU'
});

Однако при комбинировании с другими типами данных (например, внутренним идентификатором пользователя) используется ручная маска:

new Cleave('.input', {
    blocks: [1, 3, 3, 4, 2],
    delimiter: ' '
});

Таким образом создаётся гибрид:

  • телефоноподобная структура
  • расширенный идентификатор

Объединение финансовых и идентификационных форматов

Финансовые данные часто комбинируются с дополнительными идентификаторами:

  • номер карты + код банка
  • IBAN + региональный код
  • сумма + валюта

Cleave.js позволяет комбинировать такие структуры через:

  • numeral режим
  • кастомные разделители
  • постфиксы

Пример:

new Cleave('.finance', {
    numeral: true,
    numeralThousandsGroupStyle: 'thousand',
    prefix: 'USD ',
    rawValueTrimPrefix: true
});

Для расширенного комбинирования:

new Cleave('.finance', {
    blocks: [3, 3, 4, 2],
    delimiter: ' | ',
    numericOnly: false
});

Здесь в одном поле совмещаются:

  • числовые сегменты
  • текстовый префикс
  • структурированный формат

Комбинирование дат и числовых идентификаторов

Дата сама по себе является комбинированным типом данных:

  • день
  • месяц
  • год

Но при расширении она может включать:

  • код события
  • идентификатор записи
  • статус

Пример гибридной структуры:

new Cleave('.date-id', {
    blocks: [2, 2, 4, 3],
    delimiter: '/'
});

Интерпретация:

  • DD
  • MM
  • YYYY
  • ID

Такой подход часто используется в системах документооборота, где дата является частью ключа.


Кастомные форматтеры как инструмент объединения типов

Наиболее мощный механизм комбинирования — formatter.

Он позволяет полностью переопределить логику обработки значения:

new Cleave('.input', {
    formatter: function (value) {
        const cleaned = value.replace(/[^a-z0-9]/gi, '');

        const part1 = cleaned.slice(0, 2);
        const part2 = cleaned.slice(2, 6);
        const part3 = cleaned.slice(6, 10);

        return [part1, part2, part3].filter(Boolean).join('-');
    }
});

Особенность кастомного форматирования

  • нет ограничений на типы данных
  • возможно смешивание любых символов
  • логика полностью определяется разработчиком

Это превращает Cleave.js в универсальный слой форматирования поверх любых структур данных.


Смешивание локализованных форматов

В реальных приложениях часто требуется объединение:

  • локализованных чисел
  • международных кодов
  • пользовательских идентификаторов

Пример:

  • валютный формат + код страны
  • телефон + внутренний extension
  • дата + timezone offset

Пример конфигурации:

new Cleave('.local', {
    numeral: true,
    prefix: 'KZ ',
    numeralThousandsGroupStyle: 'thousand'
});

Или структурный вариант:

new Cleave('.local', {
    blocks: [2, 3, 3, 2],
    delimiter: '-',
    uppercase: true
});

Ограничения комбинирования типов данных

Несмотря на гибкость, модель Cleave.js имеет фундаментальные ограничения:

  • отсутствует строгая типизация сегментов
  • нет встроенной валидации смешанных типов
  • конфликтующие настройки могут переопределять друг друга
  • динамическая смена конфигурации требует ручного управления состоянием

На практике это означает, что сложные комбинированные форматы требуют внешней логики согласования.


Стратегии построения сложных комбинированных форматов

Применяются три основных подхода:

1. Сегментная модель

Разделение строки на логические блоки фиксированной длины

  • проста в реализации
  • предсказуема
  • ограничена структурой

2. Состояние-переключатель

Формат зависит от контекста ввода

  • переключение типов данных
  • динамическое обновление конфигурации

3. Полностью кастомная логика

Использование formatter

  • максимальная гибкость
  • полная ответственность за корректность
  • отсутствие ограничений библиотеки

Поведение при конфликте типов данных

При комбинировании настроек Cleave.js применяет приоритеты:

  • кастомный formatter перекрывает блоки
  • numeral режим отключает часть структурных правил
  • delimiter может быть переопределён в runtime
  • phone режим имеет собственную внутреннюю маску

Это означает, что комбинирование всегда является не наложением, а выбором активного слоя логики.


Практическая модель комбинированного поля

Типичный универсальный гибрид:

  • буквенный префикс (категория)
  • числовой идентификатор
  • дата
  • контрольный код
new Cleave('.complex', {
    blocks: [2, 4, 2, 2],
    delimiter: '-',
    uppercase: true,
    numericOnly: false
});

Такая структура фактически объединяет:

  • текстовую классификацию
  • числовую последовательность
  • временной компонент
  • служебный идентификатор

Роль комбинирования в архитектуре ввода данных

Комбинирование типов данных в Cleave.js выступает не как отдельная функция, а как фундаментальная модель:

  • одно поле может представлять сложную сущность
  • форматирование отделено от бизнес-логики
  • структура данных задаётся декларативно или через функцию

Такой подход позволяет использовать библиотеку не только для косметического форматирования, но и для моделирования сложных пользовательских идентификаторов прямо на уровне ввода.