【问题标题】:How can I reference a type in lib.dom.d.ts in another declaration file?如何在另一个声明文件中引用 lib.dom.d.ts 中的类型?
【发布时间】:2019-08-01 06:42:43
【问题描述】:

我对 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 类型,但它们也不使用“声明模块”。

【问题讨论】:

    标签: javascript typescript indexeddb


    【解决方案1】:

    问题

    这段代码的问题:

    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 函数导入时,建议使用上述语法。看看能不能用,如果不行,请查阅源码。

    【讨论】:

    • 谢谢!我提出了一个百事可乐,让你发现这个范围错误!
    • 我为你成功举杯!
    猜你喜欢
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多