История
Я создаю модульную библиотеку для математических операций. Я также хочу разделить библиотеку на несколько модулей: core
, relational
, vectors
и так далее. Модули можно использовать сами по себе (но все зависит от модуля core
)
- Я знаю, что нельзя использовать частичные классы Как мне разделить класс TypeScript на несколько файлов? / https://github.com/Microsoft/TypeScript/issues/563
Проблема :
Модуль core
определяет класс Set
, представляющий собой математический набор. Он определяет такие операции, как Set#add
, Set#remove
.
Однако необязательный модуль relational
добавляет Set#product
operator в Set
class.
Другие модули также могут добавлять другие операции в класс Set
. Я хочу сохранить возможность добавления функциональности, когда сочту нужным.
Вопрос
Как с помощью typescript добавить метод в класс, который находится в другом модуле?
Как я могу организовать типизацию так, чтобы пользователь моей библиотеки видел
Set#product
в своем автозавершении кода только если он установил модульrelational
? В противном случае он видит только операции#add
и#remove
?
Я разрабатываю эту библиотеку для node.js
, но также использую browserify
, чтобы связать ее для использования в браузере.
// core/set.ts
export class Set {
add(element){}
remove(element){}
}
// relational/set.ts
import {Set} from './../core/set.ts';
Set.prototype.product = function(){} // ?
// app/index.js
import {core} from 'mylib';
var set = new Set();
set.add();
set.remove();
// set.product() is not available
// app/index2.js
import {core} from 'mylib';
import {relational} from 'mylib';
var set = new Set();
set.add();
set.remove();
set.product() //is available
Бонусный вопрос
Все эти модули доступны через общее пространство имен, назовем его MyLibrary
. Модуль core
добавляет MyLibrary.Core
, а модуль relational
добавляет некоторые объекты в MyLibrary.Core
, а также добавляет MyLibrary.Relational
.
Допустим, я публикую другой модуль, который используется только как фасад для других модулей. Назовем этот модуль my-library
.
Если пользователь устанавливает модули my-library
, core
и relational
с помощью npm.
npm install my-library && npm install core and nom-install relational
В клиентском приложении хотелось бы, чтобы пользователю библиотеки оставалось только написать
var lib = require('my-library');
Затем my-library автоматически проверит все установленные модули MyLibrary, потребует их, заполнит пространство имен MyLibrary и вернет его.
Как я сообщаю модулю my-library
при первом доступе к нему как в узле, так и в браузере, чтобы
- Проверьте наличие любого доступного модуля MyLibrary (среды браузера и узла)
- Запустите метод для каждого модуля (чтобы установить их в пространство имен)
- Верните это красивое фруктовое пространство имен