Объединение объявлений
Flow позволяет объединять несколько объявлений с одним именем в одно. Два интерфейса с одинаковым именем объединяют свои члены; declare class и interface объединяются; функция или класс могут содержать статические члены, объявленные в одноимённом пространстве имён. Объединение чаще всего встречается в определениях библиотек, хотя некоторые его формы работают и в обычных исходных файлах.
Flow использует ту же модель разделённых пространств имён, что и TypeScript, и поддерживает объединение в случаях, необходимых для описания типов в объявлениях. Flow не поддерживает объединение на уровне выполнения в TypeScript (когда namespace вносит члены уровня выполнения в одноимённую функцию), расширение declare module 'name' { ... } со стороны пользователя или объединение нескольких блоков определений declare module. Сравнение для каждого случая см. в разделе Объединение объявлений поддерживается частично.
Модель разделённых пространств имён
Каждое имя независимо существует в пространстве имён значений и пространстве имён типов, поэтому один идентификатор может быть одновременно значением и типом, не вызывая конфликта. Использования в качестве значения разрешаются через пространство имён значений; использования в качестве типа — через пространство имён типов. Конструкции, применимые в обоих пространствах имён (классы, перечисления), регистрируются один раз в пространстве имён значений, а пространство имён типов обращается к ним, если в нём нет собственного определения.
const A = 1;
interface A {} // OK — `A` lives in both namespaces independently
const x: number = A; // `A` resolves as a value (the const)
declare const y: A; // `A` resolves as a type (the interface) Поддерживаемые объединения
-
interface+interface— члены объединяются. Совместимые дубликаты разрешены; конфликтующие члены приводят к ошибке. В файлах определений библиотек спискиextendsтакже объединяются путём конкатенации, сигнатуры вызова перегружаются как пересечения, а несовпадение числа параметров типа приводит к ошибке. В обычных исходных файлах объединение ограничено членами: спискиextendsи сигнатуры вызова не объединяются в объявлениях, а интерфейсы с одинаковым именем не могут оба экспортироваться из одного файла. -
declare class+interface— члены интерфейса объединяются с классом (в любом порядке). -
function/declare function+declare namespace— члены типов из пространства имён объединяются с функцией и доступны какfn.T(в любом порядке). -
class/declare class+declare namespace— члены типов из пространства имён объединяются с классом и доступны какCls.T(в любом порядке).
Не поддерживается
-
Объединение на уровне выполнения. Только члены типа из
declare namespaceнадёжно передаются одноимённой функции или классу. Члены-значения (например,declare const helper: numberвнутриdeclare namespace fn) не рассматриваются как свойства объекта на уровне выполнения. -
Несколько блоков
declare module 'name' { ... }для одного модуля. Второй блок считается переопределением первого, а не объединяется с ним. Определение libdef для данного модуля должно находиться в одном месте. -
Расширение
declare module 'name' { ... }со стороны пользователя из исходного файла. Эта форма допустима только на верхнем уровне файла библиотеки (см. раздел Объявление модуля в глобальном пространстве имён, где описан вариант, доступный только в libdef).
См. также
-
Определения библиотек — здесь чаще всего объявляются
declare class,declare namespaceи модули -
Файлы объявлений — файлы
.flow, описывающие расположенный рядом исходный код; ещё одно место, где встречаются ambient-объявления -
Интерфейсы — члены интерфейсов и механизмы
extends - Flow для пользователей TypeScript — Объединение объявлений — сравнение с TypeScript для каждого случая
© 2013–present Facebook Inc.
Licensed under the MIT License.
https://flow.org/en/docs/lang/declaration-merging