Название фичи: Слияние объявлений типов
Описание: Компилятор объединяет любое количество отдельных объявлений с идентичными именами в одно определение. Полученное определение имеет свойства, присущие всем исходным объявлениям.
Аналог в c# / js: -
Решаемая проблема:
Типобезопасное создание структур (например, в JS создается функция, которая затем расширяется с помощью добавления к ней свойств).
Возможность используется в TypeScript для моделирования ряда приемов из JavaScript и других языков программирования.
Синтаксис:
Слияние интерфейсов
Члены интерфейсов, которые не являются функциями, должны быть уникальны. Причем, при слиянии интерфейса A с последующим интерфейсом A второй будет иметь больший приоритет, чем первый (исключение - специализированные сигнатуры).
TypeScript:
interface Box {
height: number;
width: number;
}
interface Box {
scale: number;
}
let box: Box = {height: 5, width: 6, scale: 10};
Перекомпилированный в JSкод:
var box = { height: 5, width: 6, scale: 10 };
Слияние пространств имен
Для слияния объявления типов из экспортируемых интерфейсов в каждом из пространств имен объединяются, и образуется единое пространство имен с объединенными определениями интерфейсов внутри.
При слиянии значений пространства имен берется каждое определение, и, если пространство имен с таким именем уже существует, то оно расширяется добавлением экспортируемых членов из второго пространства имен.
Заметка: Неэкспортируемые члены не будут видны членам из других объявлений. TypeScript:
namespace Animals {
export class Zebra { }
}
namespace Animals {
export interface Legged { numberOfLegs: number; }
export class Dog { }
}
// Эквивалентно
namespace Animals {
export interface Legged { numberOfLegs: number; }
export class Zebra { }
export class Dog { }
}
Перекомпилированный в JSкод:
var Animals;
(function (Animals) {
var Zebra = /** @class */ (function () {
function Zebra() {
}
return Zebra;
}());
Animals.Zebra = Zebra;
})(Animals || (Animals = {}));
(function (Animals) {
var Dog = /** @class */ (function () {
function Dog() {
}
return Dog;
}());
Animals.Dog = Dog;
})(Animals || (Animals = {}));
Слияние пространств имен с классами, функциями и перечислениями Пространства имен достаточно гибки, чтобы объединяться с другими типами объявлений. Для этого объявление пространства имен должно находиться после объявления, с которым будет происходить слияние. Полученное объявление будет иметь свойства обоих исходных объявлений.