Spec-Zone.ru › Flow

Файлы деклараций

Файл деклараций — это файл .flow (например, Misc.js.flow), в котором объявляются типы модуля отдельно от его реализации .js. Когда файл .flow находится рядом с файлом реализации с таким же именем, Flow игнорирует файл реализации и вместо него считывает файл деклараций. Используйте файл деклараций, чтобы добавить типы в модуль, который вы не можете или не хотите аннотировать напрямую, — например, в сгенерированный код, код, который должен оставаться обычным JavaScript, или модуль, типы которого вы хотите переопределить.

Что такое файл деклараций?​

Рассмотрим более общий и иногда более удобный способ объявления типов для модулей: файлы .flow.

Возможны два варианта использования, в зависимости от того, существует ли файл реализации.

В первом случае экспортируемые типы модуля объявляются в файле деклараций <FILENAME>.flow, который находится в том же каталоге, что и соответствующий файл реализации <FILENAME>. Файл деклараций полностью перекрывает расположенный рядом файл реализации. Другими словами, Flow полностью игнорирует <FILENAME> и вместо него считывает <FILENAME>.flow.

Во втором случае файл реализации полностью отсутствует. <FILENAME>.flow рассматривается так, как если бы он назывался <FILENAME>.

Файлы деклараций могут перекрывать как файлы реализации .js, так и файлы реализации .json; соответствующие расширения файлов деклараций — .js.flow и .json.flow.

Теперь рассмотрим пример первого описанного выше случая. Предположим, что в файле src/LookBeforeYouLeap.js находится следующий код:

import { isLeapYear } from "./Misc";
if (isLeapYear("2020")) console.log("Yay!");

и предположим, что src/Misc.js содержит несовместимую реализацию isLeapYear:

export function isLeapYear(year: number): boolean {
  return year % 4 == 0; // yeah, this is approximate
}

Если теперь создать файл деклараций src/Misc.js.flow, содержащиеся в нём объявления будут использоваться вместо кода в src/Misc.js. Допустим, в src/Misc.js.flow находятся следующие объявления.

ПРИМЕЧАНИЕ: Синтаксис объявлений в файле деклараций такой же, как в рассмотренном ранее разделе Создание определений библиотек.

declare export function isLeapYear(year: string): boolean;

Как вы думаете, что произойдёт?

Верно, вызов isLeapYear в src/LookBeforeYouLeap.js пройдёт проверку типов, поскольку параметр year в файле деклараций ожидает значение типа string.

Как показывает этот пример, файлы деклараций нужно составлять внимательно: программист должен убедиться в их корректности, иначе они могут скрыть ошибки типов.

Встраивание объявлений в обычный код​

Иногда бывает полезно встроить объявления непосредственно в исходный код файла реализации.

В следующем примере предположим, что вы хотите завершить написание функции fooList, не создавая предварительно заглушки для её зависимостей: функции foo, которая принимает number и возвращает string, и класса List с методом map. Это можно сделать, добавив объявления для List и foo:

declare class List<T> {
  map<U>(f: (x: T) => U): List<U>;
}
declare function foo(n: number): string;


function fooList(ns: List<number>): List<string> {
  return ns.map(foo);
}

Только не забудьте заменить объявления полноценными реализациями.

Создание файлов деклараций​

Сам исполняемый файл flow не создаёт файлы деклараций. Отдельный npm-пакет flow-api-translator решает эту задачу: получив исходный файл Flow, он создаёт файл деклараций .js.flow или файл TypeScript .d.ts. Это наиболее близкий аналог режимов tsc --declaration и --emitDeclarationOnly в TypeScript.

См. также​

  • Определения библиотек — объявление типов для сторонних npm-пакетов
  • Типы модулей — импорт и экспорт типов между модулями
  • .flowconfig [declarations] — настройка режима деклараций для стороннего кода

© 2013–present Facebook Inc.
Licensed under the MIT License.
https://flow.org/en/docs/declarations

Spec-Zone.ru

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