Utvidelse av globale typer (f.eks. "Window") innenfor en TypeScript-modul
Hvis du skriver i TypeScript og ikke bruker moduler, er det mulig å utvide det globale Window-objektet. For eksempel, dette kompilerer:
interface Window {
myCounter: number;
}
window.myCounter = window.myCounter || 0;
++window.myCounter;
function outputLoadingDetails() {
console.log(`myCounter= ${window.myCounter}`)
}
Men hvis jeg legger til export foran funksjonen outputLoadingDetails, ser det ut til at jeg gjør denne filen om til en modul. Jeg får nå en kompilatorfeil når jeg prøver å få tilgang til window.myCounter.
interface Window {
myCounter: number;
}
window.myCounter = window.myCounter || 0; // ERROR: property 'MyCounter' does not exist on type `Window`
++window.myCounter; // ERROR: property 'MyCounter' does not exist on type `Window`
export function outputLoadingDetails() {
console.log(`myCounter= ${window.myCounter}`) // ERROR: property 'MyCounter' does not exist on type `Window`
}
Det ser ut til at grensesnittdeklarasjonen min ikke lenger utvider den globale Window-typen.
En løsning jeg har funnet, er å legge grensesnittdeklarasjonen i en egen *.d.ts-fil, og referere til denne fra modulen min.
Men nå er jeg nysgjerrig. Finnes det en måte jeg kan utvide Window-grensesnittet på innenfor modulens kode?
Svar #1
Ja, du trenger bare å pakke grensesnittet inn i global deklarasjon:
declare global {
interface Window {
myCounter: number;
}
}
Globalt område kan utvides fra moduler ved bruk av
declare global-deklarasjoner
Mer informasjon her
** Sørg for at filen behandles som et modul (har import eller export-setning, hvis ikke - du kan legge til en tom export {})
Svar #2
Jeg likte ikke å endre global-deklarasjonen, siden endringer ville vises i andre filer.
Dette var min løsning:
interface customWindow extends Window {
customProperty?: any;
}
declare const window: customWindow;
/* ... */
window.customProperty
