Обеспечить расширяемый интерфейс Typescript в библиотеке - PullRequest
0 голосов
/ 07 июля 2019

Я создаю библиотеку с Typescript, которая должна поддерживать сторонние плагины. Функция конструктора библиотеки должна принимать параметры базовой библиотеки и всех плагинов, поскольку модуль загрузит их в конструктор.

Можно ли предоставить базовый интерфейс Options, который каждый плагин может расширять, добавляя свои собственные свойства и типы, чтобы во всем приложении верхнего уровня (которое использует библиотеку и плагины) интерфейс Options отражал и основные параметры, и те из плагинов?

То есть с такой структурой зависимостей:

- user-app
|- my-library
|- my-library-plugin-a
|- my-library-plugin-b

Где my-library определяет следующее:

export interface Options {
  coreOption : string;
}

И my-library-plugin-a расширяет его следующим образом:

export interface PluginAOptions extends Options {
  pluginA : boolean;
}

И my-library-plugin-b расширяет его следующим образом:

export interface PluginBOptions extends Options {
  pluginB : Record<string, string>;
}

Для разработчика user-app, в состав которого входят все три модуля, интерфейс параметров, экспортированный из my-library, должен выглядеть следующим образом:

interface Options {
  coreOption : string;
  pluginA : boolean;
  pluginB : Record<string, string>;
}

Так вот что должно показать их автозаполнение, и что должен проверять компилятор Typescript.

Возможно ли что-то подобное с Typescript?

1 Ответ

0 голосов
/ 08 июля 2019

Вы не можете ожидать, что получите все расширенные опции от my-library.

Речь идет не о TypeScript, а о том, как работает зависимость. my-library ничего не знает о плагинах, и он должен. Если он каким-либо образом может экспортировать опции, добавленные плагинами, это будет зависеть от этих плагинов, что сделает архитектуру плагина бессмысленной.

В user-app вы должны просто использовать опции из plugin-a и plugin-b и комбинировать их.

const theOption: PluginAOptions & PluginBOptions = { ... }

user-app - это тот, кто знает и решил использовать plugin-a и plugin-b. Вот почему он должен и может использовать типы из этих плагинов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...