Определение типа массива произвольной вложенности

Для вложенного массива задайте рекурсивное объединение T и NestedArray<T>. Для извлечения типа конечного элемента используйте conditional type с infer.

Короткий ответ

Что ответить на собеседовании

Для вложенного массива задайте рекурсивное объединение T и NestedArray<T>. Для извлечения типа конечного элемента используйте conditional type с infer.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо задать типизацию массива, элементы которого могут быть вложены на любое количество уровней. Требуется описать такой тип так, чтобы TypeScript корректно выводил типы как для простых значений, так и для вложенных массивов любой глубины. При этом следует использовать возможности рекурсивных типов и условных операторов типов, не меняя при этом любые уже существующие блоки кода (их в задаче нет).

Ответ

Для вложенного массива задайте рекурсивное объединение T и NestedArray<T>. Для извлечения типа конечного элемента используйте conditional type с infer.

type NestedArray<T> = Array<T | NestedArray<T>>;
type Leaf<T> = T extends readonly (infer Item)[] ? Leaf<Item> : T;
const values: NestedArray<number> = [1, [2, [3]]];
type Value = Leaf<[number, [number, [number]]]>; // number

Первый тип описывает произвольную вложенность, второй раскрывает конечный тип конкретного конечного массива. Применять Leaf к самому бесконечно рекурсивному NestedArray не следует: можно превысить глубину инстанцирования TypeScript. Эти типы не проверяют JSON во время выполнения.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее