कैसे आप स्पष्ट रूप से टाइपप्रति में `window` पर एक नई प्रॉपर्टी सेट करूँ?

वोट
247

मैं सेटअप स्पष्ट रूप पर एक संपत्ति की स्थापना करके मेरी वस्तुओं के लिए वैश्विक नामस्थान window

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

टाइपप्रति को रेखांकित करता है MyNamespaceऔर उस की शिकायत:

संपत्ति 'MyNamespace' प्रकार 'विंडो' किसी भी मूल्य पर मौजूद नहीं है

मैं घोषणा करके कोड काम कर सकते हैं MyNamespaceएक परिवेश चर के रूप में और छोड़ने windowमुखरता लेकिन मैं ऐसा नहीं करना चाहता।

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;

अद्यतन: टाइपप्रति 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';

तीसरा CustomWindow के साथ वैश्विक वर खिड़की डाली

declare let window: CustomWindow;

इस तरह आप अलग आईडीई में भी लाल रेखा अगर तुम अंत कोशिश में खिड़की वस्तु के बराबर विशेषताओं के साथ उपयोग करते हैं, तो नहीं है:

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

टाइपप्रति 2.4.x के साथ परीक्षण किया गया

27/07/2017 को 13:28
का स्रोत उपयोगकर्ता

वोट
8

यहाँ यह कैसे करना है, तो आप उपयोग कर रहे हैं है टाइपप्रति परिभाषा प्रबंधक !

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 का उपयोग कर ऐसा करने के लिए, की जरूरत नहीं है।

मैं बस किया था:

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

अन्य उत्तर के अधिकांश सही नहीं कर रहे हैं।

  • उनमें से कुछ बस दुकान के लिए प्रकार निष्कर्ष को दबाने।
  • दूसरों से कुछ केवल नाम स्थान के रूप में वैश्विक चर के बारे में परवाह है, लेकिन नहीं के रूप में इंटरफ़ेस / वर्ग

मैं भी आज सुबह समान समस्या का सामना। मैं इतने पर इतने सारे "समाधान" की कोशिश की, लेकिन उनमें से कोई नहीं प्रकार की त्रुटि बिल्कुल उत्पादन और आईडीई (webstorm या vscode) में टाइप कूद ट्रिगर सक्षम करें।

अंत में, यहाँ से

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

, मैं करने के लिए एक उचित समाधान खोजने के वैश्विक चर जो इंटरफेस / वर्ग और नाम स्थान दोनों के रूप में कार्य के लिए typings देते हैं

उदाहरण के नीचे है:

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

declare interface MyNamespace {
    somemethod?()
}

declare namespace MyNamespace {
    // ...
}

अब, कोड ऊपर नाम स्थान का typings विलीन हो जाती है MyNamespaceऔर इंटरफ़ेस MyNamespaceवैश्विक चर में myNamespace(खिड़की की संपत्ति)।

19/05/2017 को 03:26
का स्रोत उपयोगकर्ता

वोट
5

आप उपयोग कर रहे हैं कोणीय CLI यह वास्तव में सीधा है (CLI RC.0 पर परीक्षण):

src / polyfills.ts

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

मेरी-कस्टम 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 कि कस्टम इंटरफ़ेस का उपयोग करते हैं, लेकिन मूल खिड़की के साथ मूल्यवान।

यह 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);
};

और अंत में, codebase में कहीं और इसका इस्तेमाल किसी के साथ:

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

सबसे पहले आप वर्तमान क्षेत्र में खिड़की वस्तु की घोषणा करने की जरूरत है।
क्योंकि टाइपप्रति वस्तु के प्रकार जानना चाहूंगा।
चूंकि विंडो ऑब्जेक्ट कहीं और परिभाषित किया गया है तो आप इसे फिर से परिभाषित नहीं कर सकते।
इस प्रकार लेकिन आप इसे घोषणा कर सकते हैं: -

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