Итак, давайте представим, что у меня есть модуль из 50 файлов, каждый из которых содержит:
export class <SomeClassName> { /* content */ }
Затем я создаю корневой файл, чтобы упростить использование, путем повторного экспорта всех файлов. Так это выглядело бы так:
export * from "./src/some-class-1";
export * from "./src/some-class-2";
export * from "./src/some-class-3";
// etc
Затем я запускаю его через TSC, чтобы создать «общий» модуль, нацеленный на «es5», с выводом дескриптора.
Все идет нормально. У меня package.json
с именем my-module
нацелена на вывод index.js
в качестве точки входа для моего модуля. Итак, я решил использовать этот модуль в другом проекте машинописного текста.
Итак, я устанавливаю для него npm install (давайте притворимся) npm install my-module
, и все это втягивается, так что теперь у меня есть файлы d.ts, которые были сгенерированы, и у меня есть фактический модуль commonjs, поэтому я могу использовать его все. Вроде все нормально.
Затем возникает проблема. Затем я решаю использовать модуль:
import {SomeClass1} from 'my-module'
Он взрывается, как в мире TS, он не знает, к чему относится my-module
, как если бы мы вернулись и смотрим на выведенный index.js, он не содержит внешнего модуля.
Итак, вот в чем проблема: общие модули обычно используют package.json в качестве ориентира при включении имен модулей, однако TS использует файлы d.ts. Тогда я подумал, что хорошо, мне нужно обернуть реэкспорт в index.ts
в модуле, поэтому я пытаюсь:
export module "my-module" { /* all other re-exports */ }
Но оказывается, что вы можете использовать только строковые имена модулей для внешних модулей, и вы можете помещать их только в файлы d.ts, однако мой файл d.ts создается из существующей кодовой базы.
Итак, вот моя дилемма: я могу вручную войти и добавить оболочку declare module "my-module
к моему d.ts, но это не очень автоматизировано, или мне нравятся сообщения в блоге с синтаксисом ES6 и ссылки на файл относительно, что в конечном итоге приведет к большому количеству of import {blah} from "../node_modules/my-module/dist/index"
, что, надеюсь, мы все можем согласиться, немного глупо.
Поэтому я не могу найти какой-либо другой подход, который работал бы в автоматизированном мире, поскольку все сообщения в блогах и документы по этой теме, когда вы используете синтаксис ES6, все используют относительный импорт файлов, а не импорт, когда все это было скомпилировано и опубликовано. через файлы d.ts.
Так есть ли способ обернуть мой реэкспорт в текстовое имя модуля? Или, по крайней мере, указать, что index.d.ts должен содержаться в внешнем модуле? (как помните, он будет выводить файл d.ts для каждого файла в проекте, но мы заботимся только об импорте модуля через index.d.ts, поскольку он повторно экспортирует все).
d.ts
файл, который ссылается на сгенерированный, и объявить там свой внешний модуль. Надеюсь, в этом больше не будет необходимости, когда люди переедут вSystem.js
- person billc.cn   schedule 13.08.2015error TS2439: Import or export declaration in an ambient module declaration cannot reference module through relative module name.
- person Grofit   schedule 14.08.2015