Проверяет понимание разницы между generic-параметром как типом элемента и как типом массива, что важно при проектировании переиспользуемых функций и утилит в TypeScript.
В TypeScript generic-параметр — это просто placeholder для типа. Когда вы пишете function f<T>(x: T), компилятор считает, что T — это тип значения x. Если вы передадите массив, T станет типом массива целиком, а не его элемента. Это часто приводит к путанице, когда нужно работать именно с элементами массива.
Есть два подхода. Первый — использовать Array<T> в сигнатуре, где T — тип элемента. Второй — ограничить generic через extends, чтобы T гарантированно был массивом.
// T — тип элемента, аргумент — массив элементов
function firstElement<T>(arr: Array<T>): T | undefined {
return arr[0];
}
const n = firstElement([1, 2, 3]); // T = number
const s = firstElement(['a', 'b']); // T = string
// T — сам массив, ограниченный Array<unknown>
function getLength<T extends Array<unknown>>(arr: T): number {
return arr.length;
}
const len = getLength([1, 2, 3]); // T = number[]
Array<T> — T описывает элемент, удобно для map/filter/reduce.T extends Array<unknown> — T описывает сам массив, удобно для функций, работающих с коллекцией как с целым.T может быть чем угодно, и компилятор не позволит вызвать arr.length.Такой подход широко применяется в библиотеках: например, в утилитах типа lodash или в React-хуках, где важно сохранить точный тип массива, а не потерять его до any[].
Итог: используйте Array<T>, когда T — элемент, и T extends Array<unknown>, когда T — сам массив. Это делает типы точнее и предотвращает ошибки вывода.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
JavaScript
TypeScript
Ключевые слова
Подпишись на React Developer в телеграм
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию