Я добавил определения 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, как определено в файле определения машинописного текста.