Проверяет понимание конфликтов при объединении интерфейсов в TypeScript, когда одинаковые ключи имеют несовместимые типы.
В TypeScript интерфейсы с одинаковым именем в одной области видимости автоматически объединяются — это называется declaration merging. Это удобно для расширения типов из библиотек, но порождает вопрос: что делать, если в двух объявлениях один и тот же ключ описан разными типами?
Subsequent property declarations must have the same type.Пример совместимого объединения:
interface User {
id: number;
name: string;
}
interface User {
id: 1; // литерал — подтип number
age: number;
}
// Итоговый тип: { id: 1; name: string; age: number }
const u: User = { id: 1, name: 'Ann', age: 30 };
Пример несовместимого объединения:
interface Config {
port: number;
}
interface Config {
port: string; // ошибка компиляции
}
Если нужно именно объединить разные типы под одним ключом, используют intersection types или union types вместо declaration merging:
type A = { value: number };
type B = { value: string };
type AB = A & B; // value: number & string — практически never
type AU = A | B; // value: number | string — рабочий вариант
Также можно переименовать интерфейсы или использовать разные пространства имён, чтобы избежать автоматического слияния.
Итог: declaration merging удобен для расширения, но требует совместимых типов у одинаковых ключей. При конфликте типов используйте union или intersection types, либо разделяйте объявления по namespace.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию