在声明文件中将命名空间从外部模块重新导出到全局

时间:2018-01-17 09:33:50

标签: typescript declaration typescript-declarations

我遇到了一些问题导出,就像它在标题上说的那样,是一个从外部模块到声明文件中的全局命名空间的命名空间。在这里,我将发布这段代码以更好地解释我的问题。

// SomeClass.d.ts - 由于不相关的原因,我必须声明这样的类

interface SomeClassConstructor {
    new(): SomeClass;
    prototype: SomeClass;
    /* static method and variables of SomeClass*/
}
interface SomeClass {
    /* method and variables of SomeClass */
}
declare const SomeClass: SomeClassConstructor;
export = SomeClass;

// externalModule.d.ts

import SomeClass_ = require("./SomeClass");
interface Module {
    /* declarations */
    SomeClass: typeof SomeClass_;
}
declare namespace Module {
    /* other declarations */
    export type SomeClass = SomeClass_;
}
export = Module;

// module.d.ts

import module = require("./externalModule");
declare global {
    interface Window {
        Module: module;
    }
    // What insert here to access Module as a namespace
}
// var someObject: /* like this here: --> */ Module.SomeClass = new window.Module.SomeClass();
//this below of course works, but I need to acces Module globally
var someOtherObject: module.SomeClass = new module.SomeClass();

编辑:也许这可以帮助某人回答这个问题。

我发现这样做:

__ // script.ts __

/// <reference path="module.d.ts"/>
const Module = window.Module;
var SomeClass = new window.Module.SomeClass();

通过类型推断我得到 SomeClass 作为类型: Module.SomeClass ,我可以访问类型:

var someObject: typeof SomeClass;

但是我必须将var SomeClass = new window.Module.SomeClass()替换为var SomeClass;(提供任何类型),以避免不必要的 Module.SomeClass 初始化。 这是一个糟糕的解决方法,我最好避免。

1 个答案:

答案 0 :(得分:0)

执行以下操作无效,因为const和名称空间不同:

// module.d.ts
declare global {
    interface Window {
        Module: module;
    }
    const Module: typeof module;
    type Module = typeof module;
}

但以下情况应该有效:

//module.d.ts
import module = require("./externalModule");
export = module
export as namespace Module
declare global {
    interface Window {
        Module: typeof module;
    }
}

请注意,如果您可以修改externalModule.d.ts,则可以在那里添加export as namespace Module声明。