Злиття оголошень - кілька оголошень з однаковою назвою в одній області видимості TypeScript об'єднує в одне.
Інтерфейси зливаються:
interface Box {
width: number;
}
interface Box {
height: number;
}
const box: Box = { width: 10, height: 20 }; // обидва поля обов'язкові
Правила:
- поля, що не збігаються, додаються;
- поле з тією самою назвою має бути того самого типу - інакше помилка;
- методи з однаковою назвою стають перевантаженнями, причому пізніші оголошення мають пріоритет.
type не зливається: повторне type Box = ... - помилка «Duplicate identifier». Це головна практична відмінність interface від type.
Namespace зливається з класом, функцією чи enum - так додають «статичні» члени:
function formatPrice(amount: number): string {
return `${amount} грн`;
}
namespace formatPrice {
export const currency = 'UAH';
}
formatPrice(10);
formatPrice.currency;
Так описують у .d.ts бібліотеки, де функція має ще й властивості (як jQuery $ і $.ajax).
Де злиття використовують на практиці:
- розширення чужих типів - доповнення модуля (module augmentation) і глобальних інтерфейсів (
Window,ProcessEnv) спирається саме на злиття інтерфейсів; - декларації бібліотек, які поєднують функцію й об'єкт;
- розширювані конфігурації - бібліотека оголошує порожній інтерфейс, а користувач доповнює його своїми полями, і бібліотека бачить їх типи (так зроблено реєстри маршрутів, подій, тем у багатьох бібліотеках).
Пастка: злиття працює й ненавмисно. Інтерфейс з назвою, яка вже є глобально (наприклад, ваш interface Event у файлі-скрипті), зіллється з вбудованим Event DOM. Тому власні типи варто тримати в модулях (файлах з import/export), де вони не потрапляють у глобальну область.
Що не зливається: класи з класами, type з будь-чим, змінні.