As const и кортеж
Массив литералов TypeScript по умолчанию считает обычным массивом:
Видеоуроки, интерактивный редактор и сохранение прогресса — бесплатно, сразу после входа.
ВойтиСоздать аккаунт — бесплатноМассив литералов TypeScript по умолчанию считает обычным массивом:
Длина не зафиксирована, порядок тоже: тип говорит только, что внутри строки и числа вперемешку. Кортеж это массив, у которого известны длина и тип каждой позиции: [string, number].
В задании функция собирает пару из двух значений:
Ошибка: «Type '(string | number)[]' is not assignable to type 'readonly [string, number]'. Target requires 2 element(s) but source may have fewer».
Параметры типа здесь работают правильно: A выводится как string, B как number. Информация теряется в момент return [a, b]. Литерал массива расширяется до (A | B)[], и на выходе уже неизвестно, что на первом месте A, а на втором B.
Возвращаемый тип не указан, он выводится из return. Значит, чинить нужно само выражение: сказать компилятору, что массив надо воспринимать как неизменяемый кортеж, а не как список.
Подробнее: const assertions — справочник TypeScript.
Сделай так, чтобы toTuple возвращала кортеж readonly [A, B], не дописывая возвращаемый тип в сигнатуру. Объявление entry менять не нужно.