Πώς μπορείτε να ορίσετε ρητά ένα νέο ακίνητο στην `window` στη γραφομηχανή;

ψήφοι
247

Μπορώ να ρυθμίσω την παγκόσμια ονομάτων για αντικείμενα μου, ορίζοντας ρητά ένα ακίνητο σε window.

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

Γραφομηχανή τονίζει MyNamespaceκαι καταγγέλλει ότι:

Το ακίνητο «MyNamespace» δεν υπάρχει στην αξία του τύπου «παράθυρο» κάθε»

Μπορώ να κάνω τον κώδικα εργασίας, δηλώνοντας MyNamespaceως μεταβλητή περιβάλλοντος και τη ρίψη του windowexplicitness, αλλά δεν θέλω να το κάνω αυτό.

declare var MyNamespace: any;

MyNamespace = MyNamespace || {};

Πώς μπορώ να κρατήσει windowεκεί και να γραφομηχανή ευτυχισμένο;

Σαν δευτερεύουσα σημείωση Θεωρώ ότι είναι ιδιαίτερα αστείο ότι γραφομηχανή παραπονιέται επειδή μου λέει ότι windowείναι του τύπου anyπου από σίγουρα μπορεί να περιέχει οτιδήποτε.

Δημοσιεύθηκε 03/10/2012 στις 14:01
πηγή χρήστη
Σε άλλες γλώσσες...                            


19 απαντήσεις

ψήφοι
253

Για να το κρατήσει δυναμική, απλά χρησιμοποιήστε:

(<any>window).MyNamespace
Απαντήθηκε 09/06/2015 στις 19:18
πηγή χρήστη

ψήφοι
235

Μόλις βρήκε την απάντηση σε αυτό το απάντησή άλλη ερώτηση του StackOverflow .

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

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

Βασικά θα πρέπει να επεκταθεί η υπάρχουσα windowδιεπαφή για να το πω για νέα ιδιοκτησία σας.

Απαντήθηκε 03/10/2012 στις 14:46
πηγή χρήστη

ψήφοι
127

Ή...

μπορείτε απλά να πληκτρολογήσετε:

window['MyNamespace']

και δεν θα πάρετε ένα σφάλμα μεταγλώττισης και λειτουργεί το ίδιο με την πληκτρολόγηση window.MyNamespace

Απαντήθηκε 20/11/2012 στις 20:36
πηγή χρήστη

ψήφοι
84

Χρησιμοποιώντας TSX; Καμία από τις άλλες απαντήσεις δούλευαν για μένα.

Εδώ είναι αυτό που έκανα:

(window as any).MyNamespace
Απαντήθηκε 15/08/2016 στις 23:25
πηγή χρήστη

ψήφοι
46

Η αποδεκτή απάντηση είναι αυτό που χρησιμοποιείται για να χρησιμοποιήσει, αλλά με γραφομηχανή 0.9. * Δεν λειτουργεί πλέον. Ο νέος ορισμός της Windowδιασύνδεσης φαίνεται να αντικαταστήσει πλήρως το ενσωματωμένο ορισμό, αντί αυξάνοντας αυτό.

Έχω πάρει για να γίνει αυτό, αντί:

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

declare var window: MyWindow;

UPDATE: Με γραφομηχανή 0.9.5 η αποδεκτή απάντηση λειτουργεί και πάλι.

Απαντήθηκε 27/08/2013 στις 22:22
πηγή χρήστη

ψήφοι
29

Αν χρειαστεί να επεκτείνει το windowαντικείμενο με έναν προσαρμοσμένο τύπο που απαιτεί τη χρήση importμπορείτε να χρησιμοποιήσετε την παρακάτω μέθοδο:

window.d.ts

import MyInterface from './MyInterface';

declare global {
    interface Window {
        propName: MyInterface
    }
}

Δείτε «Παγκόσμια Αύξηση» στη «Διακήρυξη Συγχώνευση» ενότητα του εγχειριδίου: https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation

Απαντήθηκε 23/10/2016 στις 15:24
πηγή χρήστη

ψήφοι
19

Παγκόσμια είναι «κακό» :), νομίζω ότι ο καλύτερος τρόπος για να έχουν, επίσης, τη δυνατότητα μεταφοράς είναι:

Πρώτα θα εξάγετε το περιβάλλον: (πχ: ./custom.window.ts)

export interface CustomWindow extends Window {
    customAttribute: any;
}

Δεύτερον εισάγετε

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

Τρίτον ρίχνει παγκόσμια παράθυρο var με CustomWindow

declare let window: CustomWindow;

Με αυτό τον τρόπο δεν χρειάζεται επίσης κόκκινη γραμμή σε διάφορα IDE, αν χρησιμοποιείτε με ανύπαρκτες ιδιότητες του αντικειμένου παράθυρο, έτσι ώστε στο τέλος δοκιμή:

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

Δοκιμασμένο με γραφομηχανή 2.4.x

Απαντήθηκε 27/07/2017 στις 13:28
πηγή χρήστη

ψήφοι
8

Εδώ είναι πώς να το κάνουμε, αν χρησιμοποιείτε γραφομηχανή Διαχείριση Definition !

npm install typings --global

Δημιουργία typings/custom/window.d.ts:

interface Window {
  MyNamespace: any;
}

declare var window: Window;

Εγκαταστήστε το έθιμο πληκτρολόγηση σας:

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

Τέλος, το χρησιμοποιούν ! Γραφομηχανή, δεν θα διαμαρτύρονται πια:

window.MyNamespace = window.MyNamespace || {};
Απαντήθηκε 19/11/2016 στις 21:31
πηγή χρήστη

ψήφοι
7

Δεν χρειάζεται να το κάνετε αυτό πολύ συχνά, η μόνη περίπτωση που είχα ήταν όταν χρησιμοποιούν το Redux devtools με middleware.

Εγώ απλά έκανα:

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

Εναλλακτικά, μπορείτε να κάνετε:

let myWindow = window as any;

και μετά myWindow.myProp = 'my value';

Απαντήθηκε 06/06/2018 στις 13:13
πηγή χρήστη

ψήφοι
5

Οι περισσότερες από τις υπόλοιπες απαντήσεις δεν είναι τέλεια.

  • Μερικά από αυτά καταστέλλουν ακριβώς το συμπέρασμα τύπο για το κατάστημα.
  • Μερικά από τα άλλα νοιάζεται μόνο για την παγκόσμια μεταβλητή ως ονομάτων, αλλά όχι ως διεπαφή / κλάση

Θα συναντήσετε επίσης το ίδιο πρόβλημα σήμερα το πρωί. Προσπάθησα τόσες πολλές «λύσεις» για την ΑΑ, αλλά κανένα από αυτά δεν παράγουν κανένα λάθος είδος απολύτως και θα επιτρέψει την ενεργοποίηση τύπου άλμα σε IDE (webstorm ή vscode).

Τέλος, από εδώ

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

, Να βρω μια λογική λύση για να συνδέσετε τυποποιήσεις για την παγκόσμια μεταβλητή η οποία ενεργεί ως διεπαφή / κλάση και namespace δύο .

Παράδειγμα είναι το εξής:

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

declare interface MyNamespace {
    somemethod?()
}

declare namespace MyNamespace {
    // ...
}

Τώρα, ο κώδικας παραπάνω συγχωνεύει τις τυποποιήσεις των ονομάτων MyNamespaceκαι διασύνδεσης MyNamespaceστην παγκόσμια μεταβλητή myNamespace(η ιδιότητα του παραθύρου).

Απαντήθηκε 19/05/2017 στις 03:26
πηγή χρήστη

ψήφοι
5

Αν χρησιμοποιείτε τη γωνιακή CLI είναι πολύ απλή (δοκιμαστεί σε CLI RC.0):

src / polyfills.ts

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

my-παραγγελία utils.ts

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

Είμαι χρησιμοποιώντας IntelliJ, γι 'αυτό και χρειάζεται να αλλάξετε τις ακόλουθες ρυθμίσεις στον IDE πριν από νέα polyfills μου πήρε:

> File 
> Settings 
> Languages & Frameworks 
> TypeScript 
> check 'Use TypeScript Service'.
Απαντήθηκε 21/03/2017 στις 13:38
πηγή χρήστη

ψήφοι
2

Για εκείνους που θέλουν να ορίσετε μια υπολογιστική ή δυναμικό ιδιοκτησίας στο windowαντικείμενο, θα διαπιστώσετε ότι δεν είναι δυνατόν με τη declare globalμέθοδο. Για να διευκρινιστούν για την περίπτωση χρήσης

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

Μπορεί να προσπαθήσει να κάνει κάτι τέτοιο

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

Το παραπάνω θα λάθος όμως. Αυτό οφείλεται στο γεγονός ότι στη γραφομηχανή, διασυνδέσεις δεν παίζουν καλά με υπολογίζεται ιδιότητες και θα ρίξει ένα λάθος, όπως

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

Για να πάρετε γύρω από αυτό, μπορείτε να πάτε με το προτείνουν χύτευσης windowγια <any>να μπορείτε να κάνετε

(window as any)[DynamicObject.key]
Απαντήθηκε 13/02/2019 στις 00:15
πηγή χρήστη

ψήφοι
2

Κάντε μια προσαρμοσμένη διεπαφή επεκτείνει το παράθυρο και να προσθέσετε προσαρμοσμένη ιδιότητα σας ως προαιρετικό.

Στη συνέχεια, αφήστε το customWindow που χρησιμοποιούν το δικό της interface, αλλά αποτιμώνται με το αρχικό παράθυρο.

Είναι συνεργαστεί με την typescript@3.1.3.

interface ICustomWindow extends Window {
  MyNamespace?: any
}

const customWindow:ICustomWindow = window;

customWindow.MyNamespace = customWindow.MyNamespace {} 
Απαντήθηκε 12/11/2018 στις 07:29
πηγή χρήστη

ψήφοι
2

Ήθελα να χρησιμοποιήσετε αυτό σε μια γωνιακή (6) βιβλιοθήκη του σήμερα και μου πήρε λίγο χρόνο για να πάρει αυτό το έργο, όπως αναμενόταν.

Για τη βιβλιοθήκη μου για να χρησιμοποιήσω τις δηλώσεις που έπρεπε να χρησιμοποιήσει την d.tsεπέκταση του αρχείου που δηλώνει τις νέες ιδιότητες της παγκόσμιας αντικειμένου.

Έτσι, στο τέλος, ο φάκελος έκλεισε με κάτι σαν:

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

Από τη στιγμή που δημιουργήθηκε, μην ξεχάσετε να το εκθέσει σε σας public_api.ts.

Αυτό το έκανε για μένα. Η ελπίδα αυτό βοηθά.

Απαντήθηκε 01/08/2018 στις 11:29
πηγή χρήστη

ψήφοι
2

Για την αναφορά (αυτή είναι η σωστή απάντηση):

Μέσα σε ένα .d.tsαρχείο ορισμού

type MyGlobalFunctionType = (name: string) => void

Εάν εργάζεστε στο πρόγραμμα περιήγησης, μπορείτε να προσθέσετε μέλη σε πλαίσιο παραθύρου του προγράμματος περιήγησης, ανοίξτε πάλι διεπαφή Παράθυρο για:

interface Window {
  myGlobalFunction: MyGlobalFunctionType
}

Ίδια ιδέα για NodeJS:

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

Τώρα μπορείτε να δηλώσει τη μεταβλητή ρίζα (που θα ζήσει πραγματικά στο παράθυρο ή παγκόσμια)

declare const myGlobalFunction: MyGlobalFunctionType;

Στη συνέχεια, σε ένα κανονικό .tsαρχείο, αλλά εισάγονται ως παρενέργεια, μπορείτε πραγματικά να εφαρμόσει:

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

Και, τέλος, να το χρησιμοποιήσετε σε άλλα σημεία του βάση κώδικα, είτε με:

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

myGlobalFunction("Kevin");
Απαντήθηκε 20/04/2017 στις 15:50
πηγή χρήστη

ψήφοι
1

Εάν χρησιμοποιείτε γραφομηχανή 3.x, μπορείτε να είστε σε θέση να παραλείψετε το declare globalτμήμα στις άλλες απαντήσεις και όχι απλά να χρησιμοποιήσετε:

interface Window {
  someValue: string
  another: boolean
}

Αυτό λειτούργησε μαζί μου όταν χρησιμοποιούν γραφομηχανή 3.3, WebPack και TSLint.

Απαντήθηκε 12/02/2019 στις 21:50
πηγή χρήστη

ψήφοι
0

Typscript δεν εκτελεί typecheck στις ιδιότητες κορδόνι.

window["newProperty"] = customObj;

Στην ιδανική περίπτωση, η παγκόσμια μεταβλητή σενάριο θα πρέπει να αποφεύγεται. Το χρησιμοποιώ κάποιες φορές να διορθώσετε ένα αντικείμενο στην κονσόλα του προγράμματος περιήγησης.

Απαντήθηκε 18/06/2019 στις 22:01
πηγή χρήστη

ψήφοι
0

Πρώτα θα πρέπει να δηλώσουν το αντικείμενο παράθυρο στο τρέχον πεδίο.
Επειδή γραφομηχανή θα ήθελα να μάθω τον τύπο του αντικειμένου.
Δεδομένου ότι το αντικείμενο window ορίζεται κάπου αλλού δεν μπορείτε να επαναπροσδιορίσουν.
Αλλά μπορείτε να το δηλώσετε ως εξής: -

declare var window: any;

Αυτό δεν θα επαναπροσδιορίσει το αντικείμενο παράθυρο ή δεν θα δημιουργήσει μια άλλη μεταβλητή με το όνομα window.
Αυτό σημαίνει ότι το παράθυρο ορίζεται κάπου αλλού και να είστε απλά αναφορά στο τρέχον πεδίο.

Στη συνέχεια, μπορείτε να ανατρέξετε στο αντικείμενο MyNamespace σας απλά: -

window.MyNamespace

Και τώρα η γραφομηχανή δεν θα παραπονεθεί.

Απαντήθηκε 01/06/2019 στις 01:41
πηγή χρήστη

ψήφοι
-1

Μετά την εύρεση απαντήσεων γύρω, νομίζω ότι αυτή τη σελίδα μπορεί να είναι χρήσιμη. https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation Δεν είστε σίγουροι για την ιστορία της δήλωσης συγχώνευση, αλλά εξηγεί γιατί θα μπορούσε να λειτουργήσει η ακόλουθη.

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

window.MyNamespace = window.MyNamespace || {};
Απαντήθηκε 16/03/2017 στις 17:38
πηγή χρήστη

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