टाइपप्रति: कास्टिंग HTMLElement

वोट
143

किसी को भी टाइपप्रति में कास्ट करने के लिए कैसे पता है?

मैं यह करने के कोशिश कर रहा हूँ:

var script:HTMLScriptElement = document.getElementsByName(script)[0];
alert(script.type);

लेकिन यह मुझे एक त्रुटि दे रही है:

Cannot convert 'Node' to 'HTMLScriptElement': Type 'Node' is missing property 'defer' from type 'HTMLScriptElement'
(elementName: string) => NodeList

मैं स्क्रिप्ट तत्व की 'प्रकार' सदस्य जब तक मैं इसे सही प्रकार पर डाली उपयोग नहीं कर सकते, लेकिन मैं ऐसा करने के तरीके पता नहीं है। मैं डॉक्स और नमूने की खोज है, लेकिन मैं कुछ भी नहीं मिला।

02/10/2012 को 09:33
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


12 जवाब

वोट
202

टाइपप्रति का उपयोग करता है '<>' डाले चारों ओर है, इसलिए ऊपर हो जाता है:

var script = <HTMLScriptElement>document.getElementsByName("script")[0];

हालांकि, दुर्भाग्य से आप ऐसा नहीं कर सकते:

var script = (<HTMLScriptElement[]>document.getElementsByName(id))[0];

आप त्रुटि मिलती है

Cannot convert 'NodeList' to 'HTMLScriptElement[]'

लेकिन आप कर सकते हैं:

(<HTMLScriptElement[]><any>document.getElementsByName(id))[0];
02/10/2012 को 09:47
का स्रोत उपयोगकर्ता

वोट
33

टाइपप्रति 0.9 के रूप में lib.d.tsफ़ाइल विशेष अधिभार हस्ताक्षर करने के लिए कॉल के लिए सही प्रकार के लौटने का उपयोग करता है getElementsByTagName

यह तुम अब प्रकार कथनों का उपयोग करने के प्रकार को बदलने की जरूरत का मतलब है:

// No type assertions needed
var script: HTMLScriptElement = document.getElementsByTagName('script')[0];
alert(script.type);
16/01/2014 को 00:48
का स्रोत उपयोगकर्ता

वोट
17

तुम हमेशा का उपयोग कर प्रकार प्रणाली हैक कर सकते हैं:

var script = (<HTMLScriptElement[]><any>document.getElementsByName(id))[0];
02/10/2012 को 20:22
का स्रोत उपयोगकर्ता

वोट
12

साथ अंत करने के लिए:

  • एक वास्तविक Arrayवस्तु (एक नहीं NodeListएक तरह कपड़े Array)
  • एक सूची है कि केवल करने के लिए गारंटी है में शामिल हैं HTMLElements, नहीं Nodeरों करने के लिए बल के casted HTMLElementरों
  • सही काम करने के लिए एक गर्म फजी लग रहा है

इसे इस्तेमाल करे:

let nodeList : NodeList = document.getElementsByTagName('script');
let elementList : Array<HTMLElement> = [];

if (nodeList) {
    for (let i = 0; i < nodeList.length; i++) {
        let node : Node = nodeList[i];

        // Make sure it's really an Element
        if (node.nodeType == Node.ELEMENT_NODE) {
            elementList.push(node as HTMLElement);
        }
    }
}

का आनंद लें।

25/09/2015 को 17:37
का स्रोत उपयोगकर्ता

वोट
9

बस स्पष्ट करने के लिए, यह सही है।

करने के लिए 'NodeList' कनवर्ट नहीं कर सकता 'HTMLScriptElement []'

के रूप में एक NodeListएक वास्तविक सरणी नहीं है (उदाहरण के लिए यह शामिल नहीं है .forEach, .slice, .push, आदि ...)।

इस प्रकार अगर यह करने के लिए कनवर्ट किया HTMLScriptElement[]प्रकार प्रणाली में, आप कुछ ही प्रकार त्रुटियों अगर आप कॉल करने की कोशिश प्राप्त होता Array.prototypeसंकलन समय पर इस पर सदस्यों, लेकिन यह रन टाइम पर विफल हो जाएगा।

02/10/2012 को 20:19
का स्रोत उपयोगकर्ता

वोट
8

डाली न लिखें। कभी नहीँ। प्रकार गार्ड का उपयोग करें:

const e = document.getElementsByName("script")[0];
if (!(e instanceof HTMLScriptElement)) 
  throw new Error(`Expected e to be an HTMLScriptElement, was ${e && e.constructor && e.constructor.name || e}`);
// locally TypeScript now types e as an HTMLScriptElement, same as if you casted it.

संकलक आपके लिए काम करने और जब अपनी मान्यताओं गलत बाहर बारी त्रुटियों हो।

यह इस मामले में overkill लग सकता है, लेकिन यह आप के लिए एक बहुत मदद मिलेगी अगर आप बाद में वापस आकर बदल चयनकर्ता, उदाहरण के लिए, एक वर्ग है कि डोम में याद आ रही है जोड़ना।

20/04/2017 को 17:18
का स्रोत उपयोगकर्ता

वोट
4

इस समस्या को हल करने, का उपयोग कर रहा है [index: TYPE]सरणी एक्सेस प्रकार, खुश होती है।

interface ScriptNodeList extends NodeList {
    [index: number]: HTMLScriptElement;
}

var script = ( <ScriptNodeList>document.getElementsByName('foo') )[0];
05/10/2012 को 09:37
का स्रोत उपयोगकर्ता

वोट
2

अपडेट किया गया उदाहरण:

const script: HTMLScriptElement = document.getElementsByName(id).item(0) as HTMLScriptElement;

प्रलेखन:

टाइपप्रति - मूल प्रकार - प्रकार के दावे

25/09/2018 को 09:58
का स्रोत उपयोगकर्ता

वोट
2

घोषणा फ़ाइल (lib.d.ts) में हल किया जा सकता है, तो टाइपप्रति एक वापसी प्रकार के रूप में NodeList के बजाय HTMLCollection को परिभाषित करेगा।

DOM4 भी सही वापसी प्रकार के रूप में इस निर्दिष्ट करता है, लेकिन बड़े डोम विनिर्देशों कम स्पष्ट हैं।

यह भी देखें http://typescript.codeplex.com/workitem/252

08/11/2012 को 21:32
का स्रोत उपयोगकर्ता

वोट
1

मैं भी sitepen गाइड की सिफारिश करेंगे

https://www.sitepen.com/blog/2013/12/31/definitive-guide-to-typescript/ (देखें नीचे) और https://www.sitepen.com/blog/2014/08/22/advanced -typescript-अवधारणाओं वर्गों-प्रकार /

टाइपप्रति भी एक सटीक स्ट्रिंग एक समारोह के लिए एक तर्क के रूप में प्रदान की जाती है जब आप विभिन्न वापसी प्रकार निर्दिष्ट करने के लिए अनुमति देता है। उदाहरण के लिए, डोम के createElement विधि के लिए टाइपप्रति के परिवेश घोषणा इस तरह दिखता है:

createElement(tagName: 'a'): HTMLAnchorElement;
createElement(tagName: 'abbr'): HTMLElement;
createElement(tagName: 'address'): HTMLElement;
createElement(tagName: 'area'): HTMLAreaElement;
// ... etc.
createElement(tagName: string): HTMLElement;

इसका मतलब यह है, टाइपप्रति में, जब आप कॉल जैसे document.createElement ( 'वीडियो'), टाइपप्रति जानता वापसी मान एक HTMLVideoElement है और यह सुनिश्चित करना तो आपको यह स्पष्ट टाइप करने के लिए किसी भी आवश्यकता के बिना डोम वीडियो एपीआई के साथ सही ढंग से बातचीत कर रहे हैं सक्षम हो जाएगा।

25/08/2015 को 18:35
का स्रोत उपयोगकर्ता

वोट
1

चूंकि यह एक है NodeList, न कि कोई Array, तुम नहीं वास्तव में कोष्ठक का उपयोग कर या करने के लिए कास्टिंग होना चाहिए Array। संपत्ति रास्ता प्रथम नोड प्राप्त करने के लिए है:

document.getElementsByName(id).item(0)

आप सिर्फ इतना है कि डाली कर सकते हैं:

var script = <HTMLScriptElement> document.getElementsByName(id).item(0)

या, विस्तार NodeList:

interface HTMLScriptElementNodeList extends NodeList
{
    item(index: number): HTMLScriptElement;
}
var scripts = <HTMLScriptElementNodeList> document.getElementsByName('script'),
    script = scripts.item(0);
19/12/2013 को 18:09
का स्रोत उपयोगकर्ता

वोट
0
var script = (<HTMLScriptElement[]><any>document.getElementsByName(id))[0];    
02/09/2018 को 13:36
का स्रोत उपयोगकर्ता

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