Выбор ответа Middle Задачи на типы обновлено

Разбор строки рекурсией

Вопрос

Какой тип у S?

type Split<S extends string, D extends string> =
  S extends `${infer A}${D}${infer B}` ? [A, ...Split<B, D>] : [S];

type S = Split<'a.b.c', '.'>;

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: ['a', 'b', 'c']. На каждом шаге infer A берёт кусок до первого разделителя, а infer B весь остаток.

Варианты ответа

  1. ['a.b.c']
  2. string[]
  3. ['a', 'b.c']
  4. ['a', 'b', 'c']правильный ответ

Разбор

На каждом шаге infer A берёт кусок до первого разделителя, а infer B весь остаток. Для 'a.b.c' получается A = 'a', B = 'b.c', и рекурсия продолжает с остатком. Когда разделителей больше нет, срабатывает ветка [S]. Итог ['a', 'b', 'c'].

['a', 'b.c'] был бы без рекурсивного вызова. ['a.b.c'] получился бы, если бы образец не совпал сразу. string[] даёт встроенный String.prototype.split в рантайме, а тут тип вычисляется по литералу.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.