Как вы пишете модуль узла с использованием машинописи?

Итак, общий ответ на другой вопрос (Как выИмпортировать модуль, использующий машинопись):

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;
}

... но я понятия не имею, что будет за машинопись, чтобы это было).

Ответы на вопрос(2)

Ваш ответ на вопрос