Как я могу ссылаться на тип в lib.dom.d.ts в другом файле объявления? - PullRequest
0 голосов
/ 11 марта 2019

Я довольно новичок в 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, а не на переменную, которая его использует?Я могу видеть, что jsdom смог создать класс в своих .d.ts, который ссылается на типы DOM как с интерфейсом, так и с var, но они также не используют «объявление модуля».

1 Ответ

2 голосов
/ 11 марта 2019

Проблема

Проблема с этим кодом:

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 =, export или export default зависит от того, как построена реальная библиотека JavaScript.Приведенный выше синтаксис рекомендуется, если fake-indexeddb экспортирует один элемент, и он должен хорошо работать при импорте с использованием функции require.Посмотрите, работает ли он, а если нет, обратитесь к исходному коду.

...