टाइपस्क्रिप्ट त्रुटियों को अनदेखा करें "संपत्ति प्रकार के मूल्य पर मौजूद नहीं है"


227

VS2013 में भवन बंद हो जाता है जब tsc कोड 1 से बाहर निकलता है। VS2012 में ऐसा नहीं था।

Tsc.exe त्रुटि को अनदेखा करते हुए मैं अपना समाधान कैसे चला सकता हूं?

मुझे कई The property 'x' does not exist on value of type 'y'त्रुटियां मिलती हैं, जिन्हें मैं जावास्क्रिप्ट कार्यों का उपयोग करते समय अनदेखा करना चाहता हूं।

जवाबों:


303

मुझे पता है कि प्रश्न पहले से ही बंद है, लेकिन मैंने इसे उसी टाइपस्क्रिप्ट अपवाद के लिए खोजा है, हो सकता है कि किसी और ने इस प्रश्न को इस समस्या की खोज में मारा हो।

समस्या टाइपस्क्रिप्ट टाइपिंग में गायब है:

var coordinates = outerElement[0].getBBox();

फेंकता The property 'getBBox' does not exist on value of type 'HTMLElement'.


सबसे आसान तरीका स्पष्ट रूप से चर को टाइप करना है any

var outerHtmlElement: any = outerElement[0];
var coordinates = outerHtmlElement.getBBox();

संपादित करें, 2016 के अंत में

चूंकि टाइपस्क्रिप्ट 1.6 को पसंद किया गया कास्टिंग ऑपरेटर asउन पंक्तियों को सुरुचिपूर्ण रूप में विभाजित किया जा सकता है:

let coordinates = (outerElement[0] as any).getBBox();


अन्य उपाय

बेशक अगर आप इसे सही करना चाहते हैं, जो कभी-कभी ओवरकिल होता है, तो आप कर सकते हैं:

  1. अपना स्वयं का इंटरफ़ेस बनाएँ, जो बस विस्तार करता है HTMLElement
  2. अपनी टाइपिंग का परिचय दें जो फैली हुई है HTMLElement

14
आप एक इंटरफ़ेस भी बना सकते हैं HTMLElementजो अतिरिक्त getBBoxसंपत्ति रखता है। इस तरह से आप अभी भी अन्य संपत्तियों पर कोड पूरा कर रहे हैं।
Thetallweeks

किसी भी कास्टिंग करने के बजाय getBBoxक्या कोई तरीका है जो आपस में डालना है? के प्रकार का पता लगाना getBBoxचाहते हैं?
परदीप जैन

एफई: अगर getBBoxमें होगा HTMLElementप्रकार आप इसे करने के लिए वस्तु डाली सकता है var typedElement = <HTMLElement> outerHtmlElement;
20

4
अच्छा! var coordinates = (<any>outerElement[0]).getBBox();
धनुषयज्ञ

1
यह वास्तव में इस सवाल का जवाब नहीं देता है: "त्रुटियों के लिए इग्नोर कैसे करें"
पेट्र पेलर

121

त्वरित और गंदा समाधान स्पष्ट रूप से डालना है any

(y as any).x

"लाभ" यह है कि, कास्ट स्पष्ट है, यह noImplicitAnyध्वज सेट के साथ भी संकलित होगा ।

टाइपिंग परिभाषा फ़ाइल को अद्यतन करने के लिए उचित समाधान है।

कृपया ध्यान दें कि, जब आप किसी चर को डालते हैं any, तो आप उस चर के प्रकार की जाँच से बाहर निकल जाते हैं


चूंकि मैं डिस्क्लेमर मोड में हूं, anyएक नए इंटरफ़ेस के साथ संयुक्त के माध्यम से डबल कास्टिंग , उन स्थितियों में उपयोगी हो सकता है जहां आप

  • टूटी हुई टाइपिंग फ़ाइल को अद्यतन नहीं करना चाहता
  • बंदर पैचिंग कर रहे हैं

फिर भी, आप अभी भी कुछ टाइपिंग चाहते हैं।

कहते हैं कि आप yप्रकार की OrginalDefएक नई संपत्ति xके साथ प्रकार की परिभाषा को पैच करना चाहते हैं number:

const y: OriginalDef = ...

interface DefWithNewProperties extends OriginalDef {
    x: number
}

const patched = y as any as DefWithNewProperties

patched.x = ....   //will compile

धन्यवाद इससे मदद मिली: आयात http = की आवश्यकता ('http'); var सर्वर = http किसी भी रूप में; server.Server (एप्लिकेशन); // टीएस त्रुटियों को अनदेखा करता है!
स्केप

मैंने इसका उपयोग "NodeRequire पर नहीं मिली संपत्ति को सुनिश्चित करने" में किया। इसलिए मैंने अपनी आवश्यकता को NodeRequired और (किसी भी आवश्यकता के रूप में) पर वेरिएबल घोषित किया। संपत्ति के लिए। उम्मीद है की यह मदद करेगा।
जूनी ब्रोसस

61

आप निम्न चाल का भी उपयोग कर सकते हैं:

y.x = "some custom property"//gives typescript error

y["x"] = "some custom property"//no errors

ध्यान दें, कि xएक टाइपस्क्रिप्ट त्रुटि का उपयोग करने और न करने के लिए फिर से आपको इसे इस तरह लिखने की आवश्यकता है y["x"], नहीं y.x। इसलिए इस दृष्टिकोण से अन्य विकल्प बेहतर हैं।


4
क्या किसी को पता है कि यह क्यों काम करता है, और अगर यह किसी भी संभावित प्रभाव या शुरू में वस्तु के रूप में घोषित करने पर लाभ है :any?
30:18

किसी भी कास्टिंग के बजाय टाइपिंग रखने का स्पष्ट लाभ होगा। मैं जानना चाहता हूं कि यह चेतावनी क्यों नहीं
पहुंचता

38

इस समस्या से निपटने के कई तरीके हैं। यदि यह ऑब्जेक्ट किसी बाहरी लाइब्रेरी से संबंधित है, तो सबसे अच्छा समाधान उस लाइब्रेरी के लिए वास्तविक परिभाषा फ़ाइल ( यहां बढ़िया रिपॉजिटरी ) खोजना होगा और इसका संदर्भ देना होगा, जैसे:

/// <reference path="/path/to/jquery.d.ts" >

बेशक, यह कई मामलों में लागू नहीं होता है।

यदि आप टाइप सिस्टम को 'ओवरराइड' करना चाहते हैं, तो निम्नलिखित प्रयास करें:

declare var y;

इससे आप अपनी इच्छानुसार कोई भी कॉल कर सकते हैं var y


5
अंत /// <reference path="/path/to/jquery.d.ts" />में स्व समापन टैग के साथ होना चाहिए
टिक

मैं VS2015 का उपयोग कर रहा हूं और कोणीय के लिए इस ट्यूटोरियल का अनुसरण कर रहा हूं jquery.d.ts, मेरी परियोजना में फाइल नहीं है
डिंपल

@Dimple npm install -g tsdतोtsd install jquery
आकाश

यदि आप जावास्क्रिप्ट से टाइपस्क्रिप्ट के लिए माइग्रेट कर रहे हैं, और दूसरा विकल्प TS2304 चाहते हैं, तो दूसरा विकल्प (डिक्लेयर var y) बहुत अच्छा काम करता है क्योंकि आपका पुराना जावास्क्रिप्ट दूसरी जावास्क्रिप्ट फाइल में एक चर का संदर्भ दे रहा है।
12

धन्यवाद! मेरे लिए यह मुद्दा Jest, const mockPrompt: any = jest.spyOn (चरण, 'प्रॉम्प्ट') के साथ था;
मार्क रॉबसन

18

जब टाइपस्क्रिप्ट को लगता है कि संपत्ति "x" "y" पर मौजूद नहीं है , तो आप हमेशा "y" को "किसी भी" में डाल सकते हैं, जो आपको "y" पर कुछ भी (जैसे "x") कॉल करने की अनुमति देगा।

सिद्धांत

(<any>y).x;

वास्तविक विश्व उदाहरण

मुझे इस कोड के लिए "TS2339: प्रॉपर्टी 'नाम' टाइप फंक्शन 'पर मौजूद नहीं था:

let name: string = this.constructor.name;

इसलिए मैंने इसे ठीक किया:

let name: string = (<any>this).constructor.name;

1
सुपर के साथ काम नहीं करता है। यदि आप टाइपिंग का उपयोग करते हुए एक वर्ग का विस्तार करते हैं और लेखक एक सार्वजनिक विधि भूल जाता है तो आप बहुत अधिक खराब हो जाते हैं। आपको इसे टाइप डेफिनिशन में जोड़ना होगा, जो अगली npm इंस्टॉल पर बंद हो जाता है, जिससे आप एक पुल अनुरोध बना सकते हैं या अन्यथा लेखक को सूचित कर सकते हैं, जो शायद एक अच्छी बात है लेकिन एक दर्द है।
कोरी एलिक्स

15

Angular2 में एक समस्या थी, मैं कुछ बचाने के लिए स्थानीय भंडारण का उपयोग कर रहा था और यह मुझे नहीं होने देगा।

समाधान:

मैं था localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.

इसे कैसे जोड़ेंगे:

localStorage [ 'शहर']

(LocalStorage) .city

(localStorage किसी के रूप में) ।सीटी


दूसरा विकल्प अच्छा लग रहा है, लेकिन अब वह काम नहीं करता है। काम करता है अगर आप एक वस्तु के साथ उपसर्ग करते हैं <any>- (<any>localStorage).city
जयरोजो

मुझे पता है कि यह पुराना है लेकिन आपका शीर्ष उदाहरण सिर्फ मेरे लिए काम करता है .. अच्छा किया।
MacD

4

एक त्वरित सुधार जहां और कुछ नहीं काम करता है:

const a.b = 5 // error

const a['b'] = 5 // error if ts-lint rule no-string-literal is enabled

const B = 'b'
const a[B] = 5 // always works

अच्छा अभ्यास नहीं है, लेकिन बिना स्ट्रिंग-शाब्दिक बंद करने की आवश्यकता के बिना एक समाधान प्रदान करता है


मैं यह भी करता हूं, लेकिन कुछ प्लेटफॉर्म (जैसे Google क्लाउड) एक चेतावनी संदेश देगा कि यह सुझाव है कि एब एक ['बी'] से बेहतर है। क्या आप जानते हैं कि ऐसा क्यों है?
जोनाथन

1
यकीन नहीं है, लेकिन आप उदाहरण के लिए tslint.json में, विकल्प बदल सकते हैं ताकि वह ab पसंद करे
danday74

3

मुझे पता है कि यह अब 2020 है, लेकिन मैं इस सवाल का "अनदेखा" भाग संतुष्ट करने वाला उत्तर नहीं देख सका। पता चला है, आप TSLint को निर्देश का उपयोग करके ऐसा करने के लिए कह सकते हैं;

// @ts-ignore
this.x = this.x.filter(x => x.someProp !== false);

आम तौर पर यह एक त्रुटि कह सकता है, यह बताते हुए कि 'someProp टाइप पर मौजूद नहीं है'। टिप्पणी के साथ, वह त्रुटि दूर हो जाती है।

यह संकलन करते समय फेंकी जा रही किसी भी त्रुटि को रोक देगा और आपको अपनी आईडीई की शिकायत करना भी बंद कर देना चाहिए।


0

अपने विशेष प्रोजेक्ट में मैं इसे काम करने के लिए नहीं मिला, और इस्तेमाल किया declare var $;एक साफ / अनुशंसित समाधान नहीं है, यह JQuery चर को नहीं पहचानता है, लेकिन मुझे उस का उपयोग करने के बाद कोई त्रुटि नहीं थी (और सफल होने के लिए मेरे स्वचालित निर्माण की आवश्यकता थी)।


0

मैं कुछ का उपयोग करके टाइपस्क्रिप्ट में इसे पा सकता था:

let x = [ //data inside array ];
let y = new Map<any, any>();
for (var i=0; i<x.length; i++) {
    y.set(x[i], //value for this key here);
}

यह एकमात्र तरीका प्रतीत हो रहा था कि मैं X के अंदर के मूल्यों का उपयोग कर सकता हूं जो कि Y के मानचित्र की कुंजी के रूप में हैं और संकलन करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.