Название фичи: Слияние объявлений типов

Описание: Компилятор объединяет любое количество отдельных объявлений с идентичными именами в одно определение. Полученное определение имеет свойства, присущие всем исходным объявлениям.

Аналог в 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 = {}));

Слияние пространств имен с классами, функциями и перечислениями Пространства имен достаточно гибки, чтобы объединяться с другими типами объявлений. Для этого объявление пространства имен должно находиться после объявления, с которым будет происходить слияние. Полученное объявление будет иметь свойства обоих исходных объявлений.

results matching ""

    No results matching ""