J'ai configuré des espaces de noms globaux pour mes objets en définissant explicitement une propriété window
.
window.MyNamespace = window.MyNamespace || {};
TypeScript souligne MyNamespace
et se plaint que:
La propriété 'MyNamespace' n'existe pas sur la valeur de type 'window' any "
Je peux faire fonctionner le code en déclarant MyNamespace
comme variable ambiante et en supprimant l' window
explicitness, mais je ne veux pas le faire.
declare var MyNamespace: any;
MyNamespace = MyNamespace || {};
Comment puis-je y rester window
et faire plaisir à TypeScript?
En remarque, je trouve particulièrement drôle que TypeScript se plaint car il me dit que window
c'est du type any
qui peut certainement contenir n'importe quoi.
typescript
joshuapoehls
la source
la source
Réponses:
Je viens de trouver la réponse à cela dans une autre réponse à une question StackOverflow .
Fondamentalement, vous devez étendre l'
window
interface existante pour lui parler de votre nouvelle propriété.la source
.d.ts
fichier séparé . Il ne fonctionne pas lorsqu'il est utilisé dans un.ts
fichier qui utilise lui-même les importations et les exportations. Voir cette réponse .declare global { interface Window { ... } }
travaux avec tapuscrit 2.5.2, pas besoin de.d.ts
fichier comme mentionné ci - dessuserror TS1234: An ambient module declaration is only allowed at the top level in a file.
lorsque je l'ai placé en haut du fichier, il a corrigé cette erreur, vous devrez donc peut-être le faire également.Pour le garder dynamique, utilisez simplement:
la source
as
place de<>
. Voir la réponse de @ david-boyd ci-dessous .this
-return (<any> this)['something in scope']
/* tslint:disable */
À PARTIR DE TYPESCRIPT ^ 3.4.3 CETTE SOLUTION NE FONCTIONNE PLUS
Ou...
vous pouvez simplement taper:
et vous n'obtiendrez pas une erreur de compilation et cela fonctionne de la même manière que la frappe
window.MyNamespace
la source
window['MyNamespace']()
(il suffit d'ajouter des crochets)Vous utilisez TSX? Aucune des autres réponses ne fonctionnait pour moi.
Voici ce que j'ai fait:
la source
(<any> window).MyNamespace
réalité<any>
obtient est interprété comme JSX, pas un transtypage de type.La réponse acceptée est ce que j'utilisais auparavant, mais avec TypeScript 0.9. * Cela ne fonctionne plus. La nouvelle définition de l'
Window
interface semble remplacer complètement la définition intégrée, au lieu de l'augmenter.Je me suis mis à le faire à la place:
MISE À JOUR: Avec TypeScript 0.9.5, la réponse acceptée fonctionne à nouveau.
la source
export default class MyClass{ foo(){ ... } ... }
interface MyWindow extends Window{ mc: MyClass }
declare var window: MyWindow
window.mc = new MyClass()
Ensuite, vous pouvez appeler foo (), par exemple à partir de la console Chrome Dev Tools commemc.foo()
declare var...
tous les fichiers dont vous avez besoin.Window
pour le simple fait qu'il ne s'agit pas d' une fenêtre vanille. Contourner la vérification de type ou essayer de tromper TS n'est pas non plus la façon de le faire.Global sont "mal" :), je pense que la meilleure façon d'avoir aussi la portabilité est:
Vous exportez d'abord l'interface: (par exemple: ./custom.window.ts)
Deuxièmement, vous importez
Fenêtre var globale de troisième distribution avec CustomWindow
De cette façon, vous n'avez pas de ligne rouge dans différents IDE si vous utilisez avec des attributs existants de l'objet fenêtre, donc à la fin, essayez:
Testé avec Typescript 2.4.x et plus récent!
la source
Si vous devez étendre l'
window
objet avec un type personnalisé qui nécessite l'utilisation deimport
vous pouvez utiliser la méthode suivante:window.d.ts
Voir «Augmentation globale» dans la section «Fusion de déclarations» du manuel: https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation
la source
Pour ceux qui utilisent la CLI angulaire, c'est simple:
src / polyfills.ts
my-custom-utils.ts
Si vous utilisez IntelliJ, vous devez également modifier le paramètre suivant dans l'EDI avant que vos nouveaux polyfills ne soient récupérés:
la source
declare global
est l'astuce, et cette réponse n'est pas vraiment spécifique à Angular CLI ...Je n'ai pas besoin de le faire très souvent, le seul cas que j'ai eu était lors de l'utilisation de Redux Devtools avec un middleware.
J'ai simplement fait:
Ou vous pourriez faire:
let myWindow = window as any;
et alors
myWindow.myProp = 'my value';
la source
La plupart des autres réponses ne sont pas parfaites.
Je rencontre également le même problème ce matin. J'ai essayé tant de "solutions" sur SO, mais aucune d'entre elles ne produit absolument aucune erreur de type et permet de déclencher un saut de type dans IDE (webstorm ou vscode).
Enfin, d'ici
, Je trouve une solution raisonnable pour attacher des typages pour une variable globale qui agit à la fois comme interface / classe et espace de noms .
L'exemple est ci-dessous:
Maintenant, le code ci-dessus fusionne les typages de l'espace de noms
MyNamespace
et de l'interfaceMyNamespace
dans la variable globalemyNamespace
(la propriété de la fenêtre).la source
Après avoir trouvé des réponses, je pense que cette page pourrait être utile. https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation Pas sûr de l'historique de la fusion des déclarations, mais cela explique pourquoi les éléments suivants pourraient fonctionner.
la source
Voici comment procéder, si vous utilisez le gestionnaire de définition TypeScript !
Créer
typings/custom/window.d.ts
:Installez votre saisie personnalisée:
Terminé, utilisez-le ! Le tapuscrit ne se plaindra plus
la source
typings
est devenu obsolète avec Typescript 2.0 (mi-2016) et a été archivé par le propriétaire.Typscript n'effectue pas de vérification de type sur les propriétés de chaîne.
Idéalement, le scénario de variable globale devrait être évité. Je l'utilise parfois pour déboguer un objet dans la console du navigateur.
la source
Créez un fichier appelé
global.d.ts
par exemple/src/@types/global.d.ts
puis définissez une interface comme:réf: https://www.typescriptlang.org/docs/handbook/declaration-files/templates/global-d-ts.html
la source
Si vous utilisez Typescript 3.x, vous pourrez peut-être omettre la
declare global
partie dans les autres réponses et simplement utiliser à la place:Cela a fonctionné avec moi lors de l'utilisation de Typescript 3.3, WebPack et TSLint.
la source
^3.4.3
. Cette réponse a fonctionné pour moi stackoverflow.com/a/42841166/1114926Pour référence (c'est la bonne réponse):
À l'intérieur d'un
.d.ts
fichier de définitionSi vous travaillez dans le navigateur, vous ajoutez des membres au contexte de la fenêtre du navigateur en rouvrant l'interface de Window:
Même idée pour NodeJS:
Maintenant, vous déclarez la variable racine (qui vivra en fait sur une fenêtre ou globale)
Ensuite, dans un
.ts
fichier normal , mais importé comme effet secondaire, vous l'implémentez réellement:Et enfin, utilisez-le ailleurs dans la base de code, avec:
la source
Créer une interface personnalisée étend la fenêtre et ajoutez votre propriété personnalisée en option.
Ensuite, laissez le customWindow qui utilise l'interface personnalisée, mais évalué avec la fenêtre d'origine.
Cela a fonctionné avec le [email protected].
la source
Pour ceux qui souhaitent définir une propriété calculée ou dynamique sur l'
window
objet, vous constaterez que cela n'est pas possible avec ladeclare global
méthode. Pour clarifier ce cas d'utilisationVous pourriez essayer de faire quelque chose comme ça
Ce qui précède fera cependant une erreur. En effet, dans Typescript, les interfaces ne fonctionnent pas bien avec les propriétés calculées et génèrent une erreur comme
Pour contourner ce problème, vous pouvez aller avec le suggérer de jeter
window
à de<any>
sorte que vous pouvez fairela source
En utilisant create-react-app v3.3, j'ai trouvé que le moyen le plus simple d'y parvenir était d'étendre le
Window
type dans la génération automatiquereact-app-env.d.ts
:la source
Vous devez d'abord déclarer l'objet window dans la portée actuelle.
Parce que tapuscrit voudrait connaître le type de l'objet.
Puisque l'objet fenêtre est défini ailleurs, vous ne pouvez pas le redéfinir.
Mais vous pouvez le déclarer comme suit: -
Cela ne redéfinira pas l'objet fenêtre ou ne créera pas une autre variable avec le nom
window
.Cela signifie que la fenêtre est définie ailleurs et que vous ne faites que la référencer dans la portée actuelle.
Ensuite, vous pouvez vous référer à votre objet MyNamespace simplement en: -
Ou vous pouvez définir la nouvelle propriété sur l'
window
objet simplement en: -Et maintenant le tapuscrit ne se plaindra pas.
la source
window
est défini?Je voulais l'utiliser dans une bibliothèque Angular (6) aujourd'hui et il m'a fallu un certain temps pour que cela fonctionne comme prévu.
Pour que ma bibliothèque utilise des déclarations, j'ai dû utiliser l'
d.ts
extension pour le fichier qui déclare les nouvelles propriétés de l'objet global.Donc à la fin, le fichier s'est retrouvé avec quelque chose comme:
/path-to-angular-workspace/angular-workspace/projects/angular-library/src/globals.d.ts
Une fois créé, n'oubliez pas de l'exposer dans votre
public_api.ts
.Ça l'a fait pour moi. J'espère que cela t'aides.
la source