Завдання

Реалізувати 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;

Посилання