'इस' का तात्पर्य टाइप 'कोई' है क्योंकि इसमें एक प्रकार का एनोटेशन नहीं है


124

जब मैं सक्षम noImplicitThisहोता tsconfig.jsonहूं, मुझे यह त्रुटि निम्न कोड के लिए मिलती है:

'this' implicitly has type 'any' because it does not have a type annotation.
class Foo implements EventEmitter {
  on(name: string, fn: Function) { }
  emit(name: string) { }
}

const foo = new Foo();
foo.on('error', function(err: any) {
  console.log(err);
  this.emit('end');  // error: `this` implicitly has type `any`
});

thisकॉलबैक पैरामीटर में टाइप किए गए परिणाम में एक ही त्रुटि होती है:

foo.on('error', (this: Foo, err: any) => { // error: `this` implicitly has type `any`

thisऑब्जेक्ट के साथ प्रतिस्थापित करने के लिए एक वर्कअराउंड है :

foo.on('error', (err: any) => {
  console.log(err);
  foo.emit('end');
});

लेकिन इस त्रुटि के लिए उचित निर्धारण क्या है?


अद्यतन: यह thisकॉलबैक में टाइप किए गए को जोड़ता है जो वास्तव में त्रुटि को संबोधित करता है। मैं त्रुटि देख रहा था क्योंकि मैं एक एनोटेशन के साथ एक तीर फ़ंक्शन का उपयोग कर रहा था this:

टाइपस्क्रिप्ट खेल का मैदान


क्या आपने टाइपस्क्रिप्ट 2.1 या रात के संस्करण पर यह कोशिश की थी?
डेनियल रोसेनवेसर

@ डैनियलरोसेनवेसर 2.1.4
टोनी 19

और मैं अब कारण देखता हूं कि वेबस्टॉर्म और टीएस खेल का मैदान शिकायत कर रहे थे: मैं एक प्रकार का एनोटेशन प्रदान करते हुए एक तीर फ़ंक्शन का उपयोग कर रहा था this
tony19

2
मैंने यहां एक बग दर्ज किया: github.com/Microsoft/TypeScript/issues/13768 - इसे ट्रैक करने और अंगूठे देने के लिए स्वतंत्र महसूस करें।
डैनियल रोसेनवेसर

जवाबों:


139

त्रुटि वास्तव thisमें पहले कॉलबैक पैरामीटर के रूप में एक प्रकार के एनोटेशन के साथ डालने से तय होती है । मेरी कोशिश थी कि कॉलबैक को एक तीर-फ़ंक्शन में बदलकर एक साथ जोड़ दिया जाए:

foo.on('error', (this: Foo, err: any) => { // DON'T DO THIS

यह होना चाहिए था:

foo.on('error', function(this: Foo, err: any) {

या यह:

foo.on('error', function(this: typeof foo, err: any) {

संकलक के त्रुटि संदेश को सुधारने और तीर-कार्यों के साथ वास्तविक व्याकरण त्रुटि को उजागर करने के लिए एक GitHub मुद्दा बनाया गया था this


यदि आप निर्माणकर्ता में 'इस' का उपयोग करते हैं तो किस प्रकार के एनोटेशन के लिए 'इस' की आवश्यकता होती है?
BluE

@ ब्लू मान लें कि एक सदस्य संपत्ति / फ़ंक्शन को संदर्भित किया जा रहा है, thisतो वर्ग के प्रकार को आरंभीकृत किया जाएगा। उदाहरण के लिए, यदि constructorवर्ग के लिए है MyClass, तो टाइप एनोटेशन thisहोगा MyClass
tony19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.