Spec-Zone.ru › Flow

Объединение объявлений

Flow позволяет объединять несколько объявлений с одним именем в одно. Два интерфейса с одинаковым именем объединяют свои члены; declare class и interface объединяются; функция или класс могут содержать статические члены, объявленные в одноимённом пространстве имён. Объединение чаще всего встречается в определениях библиотек, хотя некоторые его формы работают и в обычных исходных файлах.

Сравнение с TypeScript

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API