如何在另一个声明文件的lib.dom.d.ts中引用类型?

时间:2019-03-10 23:50:54

标签: javascript typescript indexeddb

我是TypeScript的新手,并尝试进行自动化测试,将IndexedDB依赖注入到我的代码中,但是我用来模拟IDB的库没有.d.ts,所以我尝试了滚动我自己的简单声明文件来解决这个问题,看起来像这样:

declare let fakeIndexedDB: IDBFactory;

declare module 'fake-indexeddb' {
  export var fakeIndexedDB;
}

但是,当我尝试使用这种类型时,出现了错误:

type 'typeof import("fake-indexeddb")' is missing the following properties from type 'IDBFactory': cmp, deleteDatabase, open

在VSCode中移动时,看起来IDBFactory的类型就是lib.dom.d.ts中的这种类型:

declare var IDBFactory: {
    prototype: IDBFactory;
    new(): IDBFactory;
};

但是我要导入的是其正上方的接口类型。我如何在声明文件中说要引用lib.dom.ts中的接口,而不是引用使用该接口的var?我可以看到jsdom能够在他们的.d.ts中创建一个同时使用接口和var引用DOM类型的类,但它们也没有使用“声明模块”。

1 个答案:

答案 0 :(得分:2)

问题

此代码的问题:

declare let fakeIndexedDB: IDBFactory;

declare module 'fake-indexeddb' {
  export var fakeIndexedDB;
}

是所导出的fakeIndexedDB的类型为any。与上面声明的变量不同。基本上,像这样定义的fake-indexeddb是一个模块,该模块导出未指定类型的称为fakeIndexedDB的单个变量。

解决方案

您应该做的是这样:

declare module 'fake-indexeddb' {
  const fakeIndexedDB: IDBFactory;

  export = fakeIndexedDB;
}

是否使用export =exportexport default取决于实际JavaScript库的构建方式。如果fake-indexeddb导出单个成员,则建议使用上述语法,并且在使用require函数导入时,它应能很好地工作。查看它是否有效,否则,请查阅源代码。