Этот вопрос проверяет понимание синтаксиса TypeScript для создания универсальных типов (generics) с необязательными параметрами, что необходимо для написания гибких и переиспользуемых компонентов.
Generics (обобщённые типы) в TypeScript позволяют создавать компоненты, которые могут работать с различными типами данных, сохраняя при этом информацию о типе. Иногда мы хотим, чтобы generic-параметр был необязательным, то есть если пользователь его не укажет, использовалось бы разумное значение по умолчанию. Это достигается с помощью синтаксиса присваивания значения по умолчанию для generic-параметра.
Основной синтаксис выглядит так: вы объявляете generic-параметр и сразу присваиваете ему тип по умолчанию через знак равенства.
// Функция с опциональным generic. По умолчанию тип — string.
function createArray<T = string>(length: number, value: T): T[] {
return Array(length).fill(value);
}
// Использование с явным указанием типа (number).
const numArray = createArray<number>(3, 42); // Тип: number[]
// Использование без указания типа — будет использован string.
const strArray = createArray(3, "hello"); // Тип: string[]
Опциональные generics особенно полезны в библиотеках и утилитах, где вы хотите предоставить гибкость, но также иметь безопасное поведение по умолчанию. Например:
createStore в состоянии, где состояние по умолчанию может быть пустым объектом.Опциональные generics можно использовать не только в функциях, но и в интерфейсах, типах и классах.
// Интерфейс ответа API с опциональным generic для данных.
interface ApiResponse<TData = Record<string, unknown>> {
success: boolean;
data: TData;
}
// Использование с конкретным типом.
const userResponse: ApiResponse<{ name: string }> = {
success: true,
data: { name: "Alice" }
};
// Использование без типа — data будет Record<string, unknown>.
const basicResponse: ApiResponse = {
success: false,
data: { errorCode: 404 }
};
Вы можете комбинировать опциональные generics с ограничениями, используя ключевое слово extends. При этом значение по умолчанию должно удовлетворять ограничению.
// Generic с ограничением (должен быть объектом) и значением по умолчанию.
function mergeObjects<T extends object = {}\>(obj1: T, obj2: T): T {
return { ...obj1, ...obj2 };
}
// Работает с любым объектом.
const result1 = mergeObjects({ a: 1 }, { b: 2 }); // Тип: { a: number, b: number }
// Если не передать аргументы, тип по умолчанию {} не будет полезен,
// но синтаксически это допустимо.
Вывод: Используйте опциональные generics с типом по умолчанию, когда вы создаёте универсальные конструкции (функции, типы, компоненты), которые должны работать "из коробки" без явного указания типа, но при этом предоставлять возможность тонкой настройки для продвинутых сценариев. Это улучшает опыт разработчика, сокращая boilerplate-код в простых случаях.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию