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

问题描述 投票:0回答:1

我是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类型,但它们也不使用“declare module”。

javascript typescript indexeddb
1个回答
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函数导入时,它可以正常工作。看看它是否有效,如果没有,请查阅源代码。

© www.soinside.com 2019 - 2024. All rights reserved.