EndsWith
Проблема
Реализовать тип EndsWith<T, U>, который проверяет, заканчивается ли строка T
на строку U. Например:
type R0 = EndsWith<"abc", "bc">; // true
type R1 = EndsWith<"abc", "abc">; // true
type R2 = EndsWith<"abc", "d">; // false
Решение
Не уверен, что эта проблема должна находится в категории среднего уровня сложности. Это больше похоже на легкий уровень сложности, чем средний. Но да ладно, кто я такой, чтобы судить.
Нам нужно проверить, что строка заканчивается на указанную подстроку. Раз в деле замешаны строки, значит нам точно будут полезны строчные тип литералы.
Давайте начнем с простейшего строчного тип литерала, который отображает все
возможные строки. Так как нам содержимое, пока что, не интересно, используем тип
any:
type EndsWith<T extends string, U extends string> = T extends `${any}`
  ? never
  : never;
С помощью этого выражения мы говорим компилятору проверить, присваиваемый ли тип
T к any. Что, конечно же, так.
Теперь, давайте добавим нашу подстроку в решение. Нам нужно проверить что
подстрока U находится в конце строки T. Давайте так и сделаем:
type EndsWith<T extends string, U extends string> = T extends `${any}${U}`
  ? never
  : never;
Используя такую конструкцию, мы проверяем, что строка присваиваемая ко всему, но
что должно заканчиваться на U - просто. Всё что остается это вернуть true
или false литералы в зависимости от результата:
type EndsWith<T extends string, U extends string> = T extends `${any}${U}`
  ? true
  : false;
Комментарии