Проблема

Реализовать Trim<T> который принимает строчный тип литерал и возвращает новый, в котором удалены пробелы с обеих сторон. Например:

type trimmed = Trim<"  Hello World  ">; // expected to be 'Hello World'

Решение

Такая же задача как и в TrimLeft<T>. Отличие только в том, что здесь нужно удалить пробелы с двух сторон, а не с одной. Воспользуемся теми же строчными тип литералами, чтобы смоделировать нужное поведение.

В отличии от TrimLeft<T>, здесь три случая: пробелы с левой стороны, пробелы с правой стороны и строка без пробелов.

Начнём с моделирования ситуации, когда пробелы слева. Объединяя строчные тип литералы с условными типами, выводим пробел и остальную часть строки. Продолжая выводить рекурсивно, избавляемся от пробелов слева.

type Trim<S> = S extends ` ${infer R}` ? Trim<R> : S;

Когда пробелы слева убраны, проверим, есть ли пробелы по правую сторону строки и сделаем то же.

type Trim<S> = S extends ` ${infer R}`
  ? Trim<R>
  : S extends `${infer L} `
  ? Trim<L>
  : S;

Таким образом, убираем пробелы с левой стороны, после, убираем с правой стороны. Этот процесс продолжается до тех пор, пока пробелов не останется и мы вернём входную строку без изменений.

Но, получаем ошибку в тестах. Это из-за того, что мы не обрабатываем случай с переводом строк и табуляцией.

Решим это добавлением их символов в объединение. Чтобы избежать дублирования, вынесем это в отдельный тип:

type Whitespace = " " | "\n" | "\t";
type Trim<S> = S extends `${Whitespace}${infer R}`
  ? Trim<R>
  : S extends `${infer L}${Whitespace}`
  ? Trim<L>
  : S;

Что почитать