Как вы пишете модуль узла с использованием машинописи?
Итак, общий ответ на другой вопрос (Как выИмпортировать модуль, использующий машинопись):
1) Создайте файл определения blah.d.ts.
2) Использование:
/// <reference path="./defs/foo/foo.d.ts"/>
import foo = require("foo");
Критически нужнои то и другое файлы foo.d.ts и foo.js где-то в ваших node_modules для загрузки;а также ИМЯ ФУ долженименно так совпадать для обоих. Сейчас...
Вопрос, на который я хотел бы ответить, как вамзаписывать модуль машинописного текста, который вы можете импортировать таким образом?
Допустим, у меня есть такой модуль:
- xq/
- xq/defs/Q.d.ts
- xq/index.ts
- xq/base.ts
- xq/thing.ts
Я хочу экспортировать модуль 'xq' с классами 'Base' из base.ts и 'Thing' из thing.ts.
Если бы это был модуль узла в javascript, мой index.ts выглядел бы примерно так:
var base = require('./base');
var thing = require('./thing');
module.exports = {
Base: base.Base,
Thing: thing.Thing
};
Давайте попробуем использовать похожий машинописный файл:
import base = require('./base');
export module xq {
export var base = base.Base;
}
Вызвать это:
tsc base.ts index.ts things.ts ... --sourcemap --declaration --target ES3
--module commonjs --outDir dist/xq
Что просходит? Ну, мы получаем наш base.d.ts:
export declare class Base<T> {
...
}
и захватывающе бесполезный index.d.ts:
export declare module xq {
var Base: any; // No type hinting! Great. :(
}
и полностью недействительный JavaScript, который не импортирует событие модуля:
(function (xq) {
xq.base = xq.base.Base;
})(exports.xq || (exports.xq = {}));
var xq = exports.xq;
Я перепробовал кучу вариаций на тему, и единственное, что я могу заставить работать:
declare var require;
var base = require('./base');
export module xq {
export var base = base.Base;
}
... но это, очевидно, полностью разрушает проверку типов.
Так.
Typescript великолепен, но этот модуль полностью отстой.
1) Можно ли это сделать с помощью встроенного генератора определений (я сомневаюсь)
2) Как ты делаешь это вручную? Я видел операторы import в файлах .d.ts, что, как я предполагаю, означает, что кто-то понял, как это сделать; как это работает? Как вы делаете машинопись для модуля, который имеет объявление с оператором импорта в нем?
(Например, я подозреваю, что правильный способ сделать объявление модуля:
/// <reference path="base.d.ts" />
declare module "xq" {
import base = require('./base');
module xq {
// Some how export the symbol base.Base as Base here
}
export = xq;
}
... но я понятия не имею, что будет за машинопись, чтобы это было).