打字稿错误"导出分配不能在具有其他导出元素的模块中使用。"同时扩展打字稿定义

时间:2018-02-09 14:50:38

标签: typescript

我已经下载了模块的类型定义,让我们从@types/module-a说出 ModuleA

module-a.d.ts 文件看起来像

declare module "module-a" {
  export = moda;
}

declare namespace moda {
  interface MODAPromise<T> {
    isResolved(): boolean;
    ....;
  }
}

现在,在我的应用程序中,我发现我需要扩展这些类型以及其他一些规范。

根据之前收到的建议,我在我的src目录中构建了一个文件 module-a.augmented.d.ts ,例如

declare module "module-a" {
    export interface MODAPromise {
        myNewProperty: any;
    }
}

如果我这样做,TypeScript会发出错误 &#34;导出分配不能用于包含其他导出元素的模块。&#34; in线

export = moda;
module-a.d.ts

。 有没有办法扩展这种类型的声明而无需触及原始的 module-a.d.ts 文件?

2 个答案:

答案 0 :(得分:5)

我发现我可以将export =语法和namespace结合使用以从接口中导出类型。据我所知,export =是必要的,以指示外部模块使用CommonJS样式的exports而不是ES6导出。如果您尝试在同一模块中同时使用export =export,则会收到以下错误消息:

  

TS2309:导出分配不能在具有其他导出元素的模块中使用。

但是,如果声明一个声明的名称空间与exports =表达式中使用的变量同名,则可以将类型放置在该名称空间内,以使使用模块可以访问它们。

以下是使用此技术的模块类型定义的示例:

declare module 'some-module' {
  namespace SomeClass {
    export interface IMyInterface {
      x:string;
    };
  }
  class SomeClass {
    constructor(p:SomeClass.IMyInterface);
  }
  exports = SomeClass;
}

答案 1 :(得分:1)

这是因为您将导出设置为module-adts中定义的“module-a”中的命名空间moda,以及“module”中的导出MODAPromise “在module-a.augmented.d.ts。中定义的

因此,您尝试定义的“module-a”如下所示:

declare module "module-a" {
    export = moda;
    export interface MODAPromise {
        // ...
    }
}

您正在尝试设置导出,并同时导出其他内容,这没有任何意义。你需要找到另一种方法来同时导出moda的MODAPromise和增强的MODAPromise。