我已经下载了模块的类型定义,让我们从@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 文件?
答案 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。