Как вы вводите циклическую ссылку в пространстве имен в файле объявлений? - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь набрать модуль UMD (который мне не принадлежит, поэтому я не могу его изменить) для проекта DefiniteTyped, который имеет что-то вроде этого (с реальными функциями, конечно):

function getModule() {
    function fn1() {}
    function fn2() {}

    fn1.fn2 = fn2;
    return fn1.fn1 = fn1;
}

if (typeof define === "function" && define.amd) {
    define(getModule());
} else if (typeof module !== "undefined" && module.exports) { 
    module.exports = getModule();
} else {
    this.moduleName = getModule();
}

Используя шаблон module-function.d.ts , у меня пока есть это:

export as namespace moduleName;

export = fn1;

declare function fn1(): void;

declare namespace fn1 {
    function fn2(): void;
}

Затем я использовал dts-gen для генерацииФайл .d.ts для меня, чтобы попытаться выяснить, как снова объявить функцию fn1 в пространстве имен fn1, и получил это:

/** Declaration file generated by dts-gen */

export = moduleName;

declare function moduleName(): void;

declare namespace moduleName {
    // Circular reference from moduleName
    const fn1: any;

    function fn2(): void;
}

Однако, когда я попытался объединить эти два вследующий код я получил ошибку 'fn1' is referenced directly or indirectly in its own type annotation..

export as namespace moduleName;

export = fn1;

declare function fn1(): void;

declare namespace fn1 {
    function fn2(): void;
    const fn1: any;
}

Я не хочу делать следующее, потому что тогда это не будет означать, что вы можете сделать require('moduleName').fn1.fn1.fn1.fn2 (или любое число fn1 с.

export = moduleName;

declare function moduleName(): void;

declare namespace moduleName {
    function fn1(): void;
    function fn2(): void;
}

Как бы я набрал этот модуль?

...