запутался о том, как получить доступ к TreeDataProvider - PullRequest
0 голосов
/ 25 апреля 2018

Я хотел бы написать расширение для vscode, но я изо всех сил пытаюсь правильно понять, как расширить TreeDataProvider.В приведенном примере возможно

export class DepNodeProvider implements vscode.TreeDataProvider<Dependency> {

.Но реализация в машинописи -

export interface TreeDataProvider<T>

, насколько я понимаю, интерфейсы машинописи не экспортируются в стандартный javascript.Как мне реализовать TreeDataProvider, если я пишу расширение на vanilla JS?

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Классы в Javascript - это просто обертки вокруг функций.

Вот самый простой TreeDataProvider, написанный как функция:

export default function MyAwesomeProvider(): vscode.TreeDataProvider<{}> {
  // do some stuff if you wish

  return {
    getTreeItem,
    getChildren,
    onDidChangeTreeData,
  }
}

В соответствии с интерфейсом, для возвращаемого объекта требуются только getTreeItem и getChildren.

Вот пример этих функций:

async function getChildren(element?: MyCustomType): Promise<MyCustomType[]> {
  const children = element
    ? await getSubListOfElement(element)
    : await getParentList()
  
  return children  
}

function getTreeItem(item: MyCustomType): vscode.TreeItem {

  return {
    id: `${item.id}`,
    collapsibleState: void 0,
    label: `${item.name}`,
    tooltip: `${item.description}`,
    iconPath: vscode.Uri.parse(item.avatarUrl),
  }
}

Итак, я не знаю о вас, но мне кажется, что расширить его гораздо проще, чем возиться с псевдо-классами и этим ООП-материалом.

Например, вы можете создать функцию более высокого порядка, чтобы обернуть ее вокруг MyAwesomeProvider, или просто сделать что-нибудь еще в этих функциях и поработать с ней.Обратите внимание, что вы также можете просто добавить больше свойств к объекту, который возвращает ваш провайдер, но Typescript будет жаловаться на то, что он больше не соответствует интерфейсу.

Есть что-то, что нужно сказать, чтобы игнорировать типы и просто делать это хорошостарый способ JS (хотя никогда не меньше, чем ES6, в конце концов, мы не дикари).

0 голосов
/ 26 апреля 2018

Вы должны понимать, что TypeScript имеет структурную систему типов.

Вы можете думать об этом как о статической типизации утки.

Использование ключевого слова implements в определении классасовершенно необязательно.На самом деле это не оказывает никакого влияния ни во время компиляции, ни во время выполнения.Он используется только для предоставления дополнительной документации по проверке правильности, но это никогда не требуется в TypeScript, поэтому, безусловно, не требуется в JavaScript.

Чтобы ответить на вопрос напрямую, в ванильном JS просто напишите

export class DepNodeProvider {
  // definitions of all members the interface requires.
}
...