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

Pic*_*cci 7 typescript

我已经下载了模块的类型定义,比方说ModuleA,从@types/module-a.

模块ADTS文件的样子

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

declare namespace moda {
  interface MODAPromise<T> {
    isResolved(): boolean;
    ....;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

以下建议早些时候收到,我建立我的src目录下的文件模块a.augmented.d.ts这样在这个

declare module "module-a" {
    export interface MODAPromise {
        myNewProperty: any;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做,TypeScript会发出错误信号"导出分配不能在包含其他导出元素的模块中使用". 排队

export = moda;
Run Code Online (Sandbox Code Playgroud)

模块ADTS.有没有办法扩展这种类型的声明而无需触及原始的module-adts文件?

bin*_*nki 9

我发现我可以将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;
}
Run Code Online (Sandbox Code Playgroud)


Ami*_*ein 2

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

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

declare module "module-a" {
    export = moda;
    export interface MODAPromise {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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