TypeScript Academy · Урок

Разделение строк на уровне типов

Разделяйте строки на кортежи внутри системы типов

Урок 2 из 413 шагов

«Разделение строк на уровне типов» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Основы комбинаторов анализаторов
  2. Разделение строк на уровне типов
  3. Разбор с помощью шаблонных литералов
  4. Мини-анализатор маршрутов на уровне типов
← Назад к TypeScript Academy