Как указать член окна является пространством имен - PullRequest
0 голосов
/ 11 февраля 2020

Я добавил определения Typescript для Windows Runtime Environment (WinRT) в свой проект UWP, но у меня действительно возникают проблемы с его использованием.

Определения типов: https://www.npmjs.com/package/@types / winrt -uwp

В проекте UWP (JavaScript / TypeScript) код ссылается на WinRT, используя объект окна следующим образом:

const memoryReport = window.Windows.System.MemoryManager.getAppMemoryReport();

После установки определений типов я могу получить предложение синтаксиса просто отлично, но ссылаться на объект окна безопасным для типов способом сложно, и что-то не так с определениями типов. В конечном итоге мне приходится делать какие-то безумные вещи:

const MemoryManager = (
  ((window as any).Windows.System.MemoryManager) as Windows.System.MemoryManager
);

// TS ERROR:
// Property 'getAppMemoryReport' is a static member of type 'MemoryManager'
const memoryReport = MemoryManager.getAppMemoryReport();

В дальнейшем я могу добавить глобальное определение для окна. Windows, но не могу указать тип, поскольку "Windows" определяется как пространство имен, а не интерфейс. Следовательно, это работает:

export {};
declare global {
  interface Window {
    Windows: any,
  }
}

Но это не работает:

export {};

declare global {
  interface Window {
    Windows: Windows, // Cannot use namespace Windows as a type
  }
}

Но создание типа "Windows" любого позволяет мне немного упростить код. Typescript по-прежнему жалуется на использование getAppMemoryReport.

const MemoryManager = window.Windows.System.MemoryManager as Windows.System.MemoryManager;
// TS ERROR:
// Property 'getAppMemoryReport' is a static member of type 'MemoryManager'
const memoryReport = MemoryManager.getAppMemoryReport();

Единственное решение, которое мне удалось найти, - это определить собственный интерфейс для оконного объекта, но это противоречит цели установки этих определений типов. , Я могу определить глобал так:

export {};

interface WinRTWindowsSystemType {
  System: {
    MemoryManager: {
      getAppMemoryReport: Function,
    },
  },
}

declare global {
  interface Window {
    Windows: WinRTWindowsSystemType,
  }
}

И затем использовать его так:

const MemoryManager = window.Windows.System.MemoryManager;
const memoryReport = MemoryManager.getAppMemoryReport();

Как я уже говорил ранее, это не идеально. Что было бы предпочтительнее, если бы я мог как-то указать это окно. Windows представляет пространство имен Windows, как определено в файле определения машинописного текста.

...