Hvordan du eksplisitt setter en ny eiendom på `window` i Loggfila?

stemmer
272

Jeg oppsett globale navnerom for mine objekter ved eksplisitt å sette en eiendom på window.

window.MyNamespace = window.MyNamespace || {};

Loggfila understreker MyNamespaceog klager over at:

Eiendommen 'MyNamespace' eksisterer ikke på verdien av type 'vinduet' noen

Jeg kan gjøre koden arbeid ved å erklære MyNamespacesom en ambient variabel og slippe windowtydelighet, men jeg ønsker ikke å gjøre det.

declare var MyNamespace: any;

MyNamespace = MyNamespace || {};

Hvordan kan jeg holde windowpå der og gjøre Loggfila lykkelig?

Som en side note Jeg synes det er spesielt morsomt at Loggfila klager siden det forteller meg at windower av typen anysom ved definitivt kan inneholde alt.

Publisert på 03/10/2012 klokken 13:01
kilden bruker
På andre språk...                            


19 svar

stemmer
276

For å holde det dynamisk, bare bruk:

(<any>window).MyNamespace
Svarte 09/06/2015 kl. 19:18
kilden bruker

stemmer
263

Bare funnet svaret på dette i en annen Stackoverflow aktuelle svar .

declare global {
    interface Window { MyNamespace: any; }
}

window.MyNamespace = window.MyNamespace || {};

I utgangspunktet må du utvide det eksisterende windowgrensesnittet for å fortelle det om den nye eiendommen.

Svarte 03/10/2012 kl. 13:46
kilden bruker

stemmer
138

Eller...

du kan bare skrive:

window['MyNamespace']

og du vil ikke få en kompileringsfeil og det fungerer på samme måte som å skrive window.MyNamespace

Svarte 20/11/2012 kl. 19:36
kilden bruker

stemmer
100

Bruke TSX? Ingen av de andre svarene jobbet for meg.

Her er hva jeg gjorde:

(window as any).MyNamespace
Svarte 15/08/2016 kl. 23:25
kilden bruker

stemmer
49

Den aksepterte svaret er hva jeg pleide å bruke, men med Loggfila 0.9. * Det ikke lenger fungerer. Den nye definisjonen av Windowgrensesnittet ser ut til å erstatte den innebygde definisjon, i stedet for å forsterke den.

Jeg har tatt til å gjøre dette i stedet:

interface MyWindow extends Window {
    myFunction(): void;
}

declare var window: MyWindow;

OPPDATERING: Med Loggfila 0.9.5 aksepterte svaret fungerer igjen.

Svarte 27/08/2013 kl. 21:22
kilden bruker

stemmer
30

Hvis du trenger å forlenge windowobjekt med en tilpasset type som krever bruk av importkan du bruke følgende metode:

window.d.ts

import MyInterface from './MyInterface';

declare global {
    interface Window {
        propName: MyInterface
    }
}

Se 'Globalt Augmentation' i 'Declaration Sammenslåing' delen av håndboken: https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation

Svarte 23/10/2016 kl. 15:24
kilden bruker

stemmer
21

Utland "onde" :), jeg tror den beste måten å ha også portabilitet er:

Først eksporterer du grensesnittet: (f.eks: ./custom.window.ts)

export interface CustomWindow extends Window {
    customAttribute: any;
}

Second du importerer

import {CustomWindow} from './custom.window.ts';

Tredje kastet global Var vindu med CustomWindow

declare let window: CustomWindow;

På denne måten trenger du ikke også røde linjen i forskjellige IDE hvis du bruker med eksisterende attributter vinduet objektet, så på slutten forsøk:

window.customAttribute = 'works';
window.location.href = '/works';

Testet med Loggfila 2.4.x

Svarte 27/07/2017 kl. 13:28
kilden bruker

stemmer
8

Her er hvordan du gjør det, hvis du bruker typescript Definisjon manager !

npm install typings --global

Lag typings/custom/window.d.ts:

interface Window {
  MyNamespace: any;
}

declare var window: Window;

Installere den tilpassede skrive:

typings install file:typings/custom/window.d.ts --save --global

Ferdig, bruk den ! Loggfila vil ikke klage lenger:

window.MyNamespace = window.MyNamespace || {};
Svarte 19/11/2016 kl. 21:31
kilden bruker

stemmer
7

Jeg trenger ikke å gjøre dette veldig ofte, det eneste tilfellet jeg har hatt var når du bruker Redux DevTools med mellomvare.

Jeg bare gjorde:

const composeEnhancers = (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;

Eller du kan gjøre:

let myWindow = window as any;

og så myWindow.myProp = 'my value';

Svarte 06/06/2018 kl. 13:13
kilden bruker

stemmer
6

De fleste av de andre svarene er ikke perfekt.

  • Noen av dem bare undertrykke den type slutning for butikken.
  • Noen av de andre bare bryr seg om global variabel som navnerom, men ikke som grensesnitt / klasse

Jeg også møte lignende problem i morges. Jeg prøvde så mange "løsninger" på det, men ingen av dem produserer ingen type feil helt og aktivere utløser typen hopping i IDE (webstorm eller vscode).

Til slutt, herfra

https://github.com/Microsoft/TypeScript/issues/3180#issuecomment-102523512

Finner jeg en rimelig løsning for å feste typings for global variabel som fungerer som grensesnitt / klasse og navne begge .

Eksempel er nedenfor:

// typings.d.ts
declare interface Window {
    myNamespace?: MyNamespace & typeof MyNamespace
}

declare interface MyNamespace {
    somemethod?()
}

declare namespace MyNamespace {
    // ...
}

Nå koden ovenfor fusjonerer de typings av navnerommet MyNamespaceog grensesnitt MyNamespacei den globale variabelen myNamespace(eies av vinduet).

Svarte 19/05/2017 kl. 03:26
kilden bruker

stemmer
5

Hvis du bruker Vinkel CLI det er veldig grei (testet på CLI RC.0):

src / polyfills.ts

declare global {
  interface Window {
    myCustomFn: () => void;
  }
}

my-custom-utils.ts

window.myCustomFn = function () {
  ...
};

Jeg bruker IntelliJ, så jeg trengte også å endre følgende innstilling i IDE før mine nye polyfills plukket opp:

> File 
> Settings 
> Languages & Frameworks 
> TypeScript 
> check 'Use TypeScript Service'.
Svarte 21/03/2017 kl. 13:38
kilden bruker

stemmer
3

For referanse (dette er det riktige svaret):

Inne i en .d.tsdefinisjon fil

type MyGlobalFunctionType = (name: string) => void

Hvis du arbeider i nettleseren, legger du medlemmer til nettleservinduet sammenheng med gjenåpning Vindu grensesnitt:

interface Window {
  myGlobalFunction: MyGlobalFunctionType
}

Samme idé for NodeJS:

declare module NodeJS {
  interface Global {
    myGlobalFunction: MyGlobalFunctionType
  }
}

Nå erklærer du roten variabel (som faktisk vil leve på vinduet eller global)

declare const myGlobalFunction: MyGlobalFunctionType;

Så i en vanlig .tsfil, men importert som bieffekt, du faktisk gjennomføre det:

global/* or window */.myGlobalFunction = function (name: string) {
  console.log("Hey !", name);
};

Og til slutt bruke det andre steder i kodebase, med enten:

global/* or window */.myGlobalFunction("Kevin");

myGlobalFunction("Kevin");
Svarte 20/04/2017 kl. 15:50
kilden bruker

stemmer
2

For de som ønsker å sette en beregnet eller dynamisk eiendom på windowobjektet, vil du finne at ikke mulig med den declare globalmetoden. For å klargjøre for denne bruken saken

window[DynamicObject.key] // Element implicitly has an 'any' type because type Window has no index signature

Du kan forsøke å gjøre noe som dette

declare global {
  interface Window {
    [DyanmicObject.key]: string; // error RIP
  }
}

Ovennevnte vil feil skjønt. Dette skyldes at i maskinskrevet manuskript, gjør grensesnittene ikke spille godt med beregnede egenskaper og vil kaste en feilmelding som

A computed property name in an interface must directly refer to a built-in symbol

For å komme rundt dette, kan du gå med foreslå for støping windowtil <any>slik at du kan gjøre

(window as any)[DynamicObject.key]
Svarte 13/02/2019 kl. 00:15
kilden bruker

stemmer
2

Lag en tilpasset grensesnitt utvider vinduet og legge den tilpassede eiendom som tilleggsutstyr.

Deretter la customWindow som bruker tilpasset grensesnitt, men verdsatt med det opprinnelige vinduet.

Det har fungert med typescript@3.1.3.

interface ICustomWindow extends Window {
  MyNamespace?: any
}

const customWindow:ICustomWindow = window;

customWindow.MyNamespace = customWindow.MyNamespace {} 
Svarte 12/11/2018 kl. 07:29
kilden bruker

stemmer
2

Jeg ønsket å bruke dette i en vinkel (6) bibliotek i dag, og det tok meg en stund å få dette til å fungere som forventet.

For min biblioteket for å bruke erklæringer måtte jeg bruke d.tsextention for filen som erklærer de nye egenskapene til den globale objektet.

Så til slutt, filen endte opp med noe sånt som:

/path-to-angular-workspace/angular-workspace/projects/angular-library/src/globals.d.ts

Når den er laget, ikke glem å avsløre den i public_api.ts.

Som gjorde det for meg. Håper dette hjelper.

Svarte 01/08/2018 kl. 11:29
kilden bruker

stemmer
2

Etter å ha funnet svar rundt, tror jeg denne siden kan være nyttig. https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation Ikke sikker på om historien til erklæringen sammenslåing, men det forklarer hvorfor det følgende kan fungere.

declare global {
    interface Window { MyNamespace: any; }
}

window.MyNamespace = window.MyNamespace || {};
Svarte 16/03/2017 kl. 17:38
kilden bruker

stemmer
1

Hvis du bruker Loggfila 3.x, kan du være i stand til å utelate declare globalen del i de andre svarene og i stedet bare bruke:

interface Window {
  someValue: string
  another: boolean
}

Dette jobbet med meg når du bruker Loggfila 3,3, WebPack og TSLint.

Svarte 12/02/2019 kl. 21:50
kilden bruker

stemmer
0

Typscript utfører ikke typecheck på strengegenskaper.

window["newProperty"] = customObj;

Ideelt sett bør den globale variabelen scenario unngås. Jeg bruker det noen ganger for å feilsøke et objekt i nettkonsollen.

Svarte 18/06/2019 kl. 22:01
kilden bruker

stemmer
0

Først må du deklarere vinduet objektet i dagens omfang.
Fordi Loggfila vil gjerne vite hvilken type av objektet.
Siden vinduet objekt er definert et annet sted du ikke kan omdefinere det.
Men du kan erklære det slik: -

declare var window: any;

Dette vil ikke omdefinere vinduet objektet eller det vil ikke opprette en ny variabel med navn window.
Dette betyr vinduet er definert et annet sted, og du er bare refererer det i dagens omfang.

Deretter kan du se i MyNamespace objekt bare ved: -

window.MyNamespace

Og nå Loggfila vil ikke klage.

Svarte 01/06/2019 kl. 01:41
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more