Разделение строк на уровне типов
Разделяйте строки на кортежи внутри системы типов
«Разделение строк на уровне типов» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.
Шаблонные строковые типы
Система типов может сопоставлять шаблоны со строковыми типами-литералами с помощью шаблонных строковых типов в сочетании с infer. Это основной инструмент для разбора строк на уровне типов.
Обозначения: в настоящем TypeScript шаблонные строковые типы записываются строками, ограниченными обратными кавычками и содержащими места для подстановок с долларом и фигурными скобками. В этих фрагментах мы показываем такой шаблон в виде Tpl<...>, перечисляя его части по порядку; например, шаблон в обратных кавычках, сопоставляющий сначала литеральный префикс, а затем Rest, выглядит как Tpl<'prefix', infer Rest>.
type StartsWithA<S> = S extends Tpl<'a', string> ? true : false;
// Tpl<'a', string> is a backtick template literal type: 'a' then anything
type X = StartsWithA<'abc'>; // true
type Y = StartsWithA<'bcd'>; // falseВывод суффикса
Поместите infer внутрь шаблона, чтобы захватить часть строки. Здесь мы захватываем всё после начального "a".
type AfterA<S> = S extends Tpl<'a', infer Rest> ? Rest : never;
// Tpl<'a', Rest> captures everything after a leading 'a'
type X = AfterA<'abc'>; // 'bc'Разбиение по разделителю
Чтобы разделить строку по первому вхождению разделителя, сопоставьте шаблон «начало, разделитель, конец» и выведите обе стороны. Выбирается первое совпадение, поскольку при выводе начало жадно захватывается слева.
type SplitOnce<S, Sep extends string> =
S extends Tpl<infer Head, Sep, infer Tail>
? [Head, Tail]
: [S];
// Tpl<Head, Sep, Tail> matches up to the first separator
type X = SplitOnce<'a-b-c', '-'>; // ['a', 'b-c']Рекурсивное разбиение
Чтобы получить все части, рекурсивно обработайте конец строки. Добавляйте каждое начало в кортеж, пока в строке не останется разделителей.
type Split<S extends string, Sep extends string> =
S extends Tpl<infer Head, Sep, infer Tail>
? [Head, ...Split<Tail, Sep>]
: [S];
// recurse on Tail until no separator remains
type X = Split<'a.b.c', '.'>; // ['a', 'b', 'c']Проход по рекурсии
Проследите за разбором Split<"a.b.c", ".">:
- Начало "a", хвост "b.c" -> ["a", ...результат разбиения "b.c"]
- Начало "b", хвост "c" -> ["b", ...результат разбиения "c"]
- В строке "c" нет ".", базовый случай -> ["c"]
Результат: ["a", "b", "c"].
type X = Split<"one,two", ",">; // ["one", "two"]
type Y = Split<"x/y/z", "/">; // ["x", "y", "z"]Обработка пустых сегментов
При разбиении могут появляться пустые строки, если разделители стоят рядом или находятся по краям. Шаблон по-прежнему сопоставляется, выводя пустой Head или Tail.
type X = Split<"a,,b", ",">; // ["a", "", "b"]
type Y = Split<",a", ",">; // ["", "a"]Обратное объединение
Обратная операция разбиения — объединение: пройдите по кортежу строк и соедините их разделителем с помощью шаблонной строки. Эта операция естественным образом дополняет разбиение.
type Join<T extends string[], Sep extends string> =
T extends [infer H extends string, ...infer R extends string[]]
? R extends [] ? H : Tpl<H, Sep, Join<R, Sep>>
: '';
// Tpl<...> denotes a template literal type concatenation
type X = Join<['a', 'b', 'c'], '-'>; // 'a-b-c'Удаление пробелов по краям
Строковые утилиты можно объединять. Тип Trim удаляет начальные и конечные пробелы, многократно убирая пробел с помощью вывода по шаблону.
type TrimLeft<S extends string> =
S extends Tpl<' ', infer R> ? TrimLeft<R> : S;
type TrimRight<S extends string> =
S extends Tpl<infer R, ' '> ? TrimRight<R> : S;
type Trim<S extends string> = TrimRight<TrimLeft<S>>;
// Tpl<' ', R> strips a leading space; Tpl<R, ' '> strips a trailing one
type X = Trim<' hi '>; // 'hi'Замена подстрок
Замена выполняется через разбиение строки вокруг искомого фрагмента и повторное объединение с заменой — всё с помощью вывода по шаблону и рекурсии.
type ReplaceAll<S extends string, From extends string, To extends string> =
S extends Tpl<infer A, From, infer B>
? Tpl<A, To, ReplaceAll<B, From, To>>
: S;
// split around From, then rejoin with To via template literal types
type X = ReplaceAll<'a-b-c', '-', '_'>; // 'a_b_c'Зачем нужно разбиение
Разбиение — основа структурированного разбора. Маршруты разделяются по "/", строки запросов — по "&", строки CSV — по ",". С помощью Split плоский строковый тип превращается в кортеж, элементы которого можно обрабатывать по одному.
type Segments = Split<"users/42/posts", "/">; // ["users", "42", "posts"]Ограничение глубины
Рекурсия над строками на уровне типов ограничена пределом глубины компилятора. Очень длинные строки или большое количество разделителей могут превысить его. Для обычных входных данных (путей и небольших форматов) всё работает без проблем.
type Ok = Split<"a/b/c/d/e", "/">; // fine for small stringsБыстрая проверка
Проверьте, насколько хорошо Вы понимаете разбиение строк на уровне типов.
Итоги
Вы полностью разделили строки на уровне типов.
- Шаблонные строковые типы вместе с
inferсопоставляют части строк и захватывают их. SplitOnceразделяет строку по первому разделителю, а рекурсия формирует полныйSplit.- Объединение, удаление пробелов и ReplaceAll строятся на тех же инструментах.
Далее: извлечение структурированных данных из строковых типов.
Изучай TypeScript с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 101
- Уроки
- 352
Часто задаваемые вопросы
Урок «Разделение строк на уровне типов» бесплатный?
Да — полный текст урока «Разделение строк на уровне типов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «Разделение строк на уровне типов»?
Разделяйте строки на кортежи внутри системы типов Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Разделение строк на уровне типов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы комбинаторов анализаторов
- Разделение строк на уровне типов
- Разбор с помощью шаблонных литералов
- Мини-анализатор маршрутов на уровне типов