Используйте variadic tuple types и разрешите readonly-кортежи в ограничениях. Результирующий кортеж должен быть изменяемым, как в тесте для as const.
Реализация объединения кортежей в TypeScript
Используйте variadic tuple types и разрешите readonly-кортежи в ограничениях. Результирующий кортеж должен быть изменяемым, как в тесте для as const.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо создать тип Concat, который принимает два кортежа и возвращает новый кортеж, содержащий элементы первого кортежа, за которыми следуют элементы второго.
/* _____________ Your Code Here _____________ */
type Concat<T, U> = any
/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'
const tuple = [1] as const
type cases = [
Expect<Equal<Concat<[], []>, []>>,
Expect<Equal<Concat<[], [1]>, [1]>>,
Expect<Equal<Concat<typeof tuple, typeof tuple>, [1, 1]>>,
Expect<Equal<Concat<[1, 2], [3, 4]>, [1, 2, 3, 4]>>,
Expect<Equal<Concat<['1', 2, '3'], [false, boolean, '6']>, ['1', 2, '3', false, boolean, '6']>>,
]
// @ts-expect-error
type error = Concat<null, undefined>
Ответ
Используйте variadic tuple types и разрешите readonly-кортежи в ограничениях. Результирующий кортеж должен быть изменяемым, как в тесте для as const.
type Concat<T extends readonly unknown[], U extends readonly unknown[]> = [...T, ...U];
Разворачивание T и U сохраняет порядок и точные типы элементов. readonly в ограничении позволяет передать typeof tuple из [1] as const, но отсутствие readonly перед результатом даёт [1, 1], как требуется. При включённом strictNullChecks null и undefined не удовлетворяют ограничениям, поэтому негативный тест корректен. Это типовая операция, исполняемого объединения массивов она не создаёт.