Создание распространяемых пакетов с потоковым типом со сторонними типами зависимостей

У меня есть библиотека, использующая типы Flow. Он также имеет зависимость, и часть его интерфейса включает определения типов из файла flow-typed для этой библиотеки. Я использую flow-copy-source, чтобы убедиться, что в установленном пакете есть файлы .js.flow.

Проблема, с которой я столкнулся, заключается в том, что когда потребитель этой библиотеки импортирует мой модуль, импортируемые типы из зависимости также импортируются, но теперь потребитель должен установить свою собственную копию определений flow-typed для этой зависимости. Обычно это было бы хорошо, но если этот потребляющий код имеет другой версия самой зависимости, нет способа избежать противоречивых определений.

Конкретно говоря, моя библиотека представляет собой оболочку службы HTTP, использующую axios@0.18.x, и имеет такой импорт:

import type { Axios, AxiosXHRConfig } from 'axios';

AxiosXHRConfig в версии 0.18.x определения flow-typed принимает два параметра типа. Тем временем приложение потребляющий использует старую версию axios и имеет другую версию определения библиотеки axios для этой старой версии. Поскольку в обоих определениях библиотеки есть:

declare module "axios" {
  // ...
}

... у import type { ... } from 'axios' в библиотеке нет способа разрешить flow-typed/npm/axios_v0.18.x.js в библиотеке вместо flow-typed/npm/axios_v0.17.x.js приложения-потребителя.

Если не считать дублирования определений flow-typed в библиотеке, как сделать распространяемые пакеты потокового типа с глобальными зависимостями типов, которые можно безопасно использовать в других потоковых проектах?

0
0
206
1

Ответы 1

Я использую этот подход как обходной путь вручную, пока не услышу о более автоматическом способе сделать это:

  1. Создайте файл потока /src/interface.js только с общедоступным интерфейсом для моей библиотеки
  2. Попросите мой клиентский класс реализовать этот общедоступный интерфейс
  3. Прекратите использование flow-copy-source
  4. Опубликуйте как мой /src, так и перенесенный каталог /lib.
  5. Добавьте index.js и index.js.flow, которые стирают типизацию для реализации интерфейса, например:

index.js:

module.exports = require('./lib/client').default;

index.js.flow:

// @flow

import type { FooClient as _FooClient } from './src/interface';
export type FooClient = _FooClient;

const Client: Class<FooClient> = require('./lib/client').default;

export default Client;

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

Другие вопросы по теме