Расширить глобально объявленный тип в Typescript - PullRequest
1 голос
/ 29 января 2020

Фон:

Я создаю приложение, которое будет работать с Permissions и Clipboard API. Стандартная библиотека Typescript не имеет наборов для большинства передовых API буфера обмена, поэтому я решил создать файл .d.ts для расширения таких неполных интерфейсов. Он содержит такие объявления:

declare class ClipboardItem {
  constructor(data: { [mimeType: string]: Blob });
}

, и я ссылаюсь на него из своего кода следующим образом: /// <reference path="clipboard.d.ts" />

Пока все хорошо: добавляются отсутствующие интерфейсы, расширяются существующие, автозаполнение работает правильно. Но потом я пришел к запросу "clipboard-read" разрешения. Я хочу передать эту строку при вызове navigator.permissions.query({name: "clipboard-read"}), где тип name определен в стандартной библиотеке Typescript следующим образом:

type PermissionName = "geolocation" |  ... | "clipboard";

И там нет «чтения из буфера обмена». Поэтому я хочу расширить его, чтобы он включал «чтение из буфера обмена». Теперь, если в моем файле .d.ts я пишу

type PermissionName = 'clipboard-read';

, это показывает мне ошибку Duplicate identifier 'PermissionName'.ts(2300). Я пробовал другие варианты, но все они сводились к ошибке идентификатора дубликата.

Вопрос:

Есть ли способ расширить не interface, а type, который уже был глобально объявлено в другом месте? Что я должен сделать, чтобы достичь этого?

1 Ответ

3 голосов
/ 29 января 2020

Насколько я знаю, вы не можете "переопределить" существующий тип с помощью Typescript. Вы можете изменить файл lib/dom.d.ts в папке node_modules, но, на мой взгляд, это определенно не очень хороший вариант.

Единственное жизнеспособное решение, которое я вижу, это разыграть:

navigator.permissions.query({name: 'clipboard-write' as PermissionName});

или для создания пользовательского типа и метода переноса (который будет приведен):

type  MyPermissionName = PermissionName | 'clipboard-read' | 'clipboard-write';

function requestPermission(permission: MyPermissionName) {
  return navigator.permissions.query({name: permission as PermissionName});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...