नीचे दिए गए कोड के साथ, टाइपस्क्रिप्ट thisArg के संदर्भ को नहीं पहचान पाएगा (जो a होना चाहिए और उसमें saySomething() विधि होनी चाहिए। क्या thisArg का संदर्भ देने का कोई और तरीका है। टाइपस्क्रिप्ट के लिए?

कोड:

class A {
    saySomething() {
        console.log('Hello!');
    }
}

class B {
    constructor(a: A) {
        const boundSaySomething = this.saySomethingMyself.bind(a);
        boundSaySomething();
    }

    saySomethingMyself() {
        this.saySomething();
    }
}

const test = new B(new A());

कंसोल सही ढंग से लॉग करता है Hello, लेकिन प्रकार की जाँच कह रही है

Property 'saySomething' does not exist on type 'B'.(2339)

0
umbe1987 17 जुलाई 2020, 15:52

3 जवाब

सबसे बढ़िया उत्तर

इस उत्तर ने मेरी समस्या का समाधान कर दिया।

मूल रूप से, मुझे करना था

फ़ंक्शन के पहले तर्क के रूप में इसे (और इसके प्रकार) जोड़कर किसी भी फ़ंक्शन में इसका संदर्भ बदलें।

मेरे मामले में, मुझे saySomethingMyself पद्धति को saySomethingMyself() से saySomethingMyself(this: A) में बदलना पड़ा।

पूर्ण अद्यतन कोड:

class A {
    saySomething() {
        console.log('Hello!');
    }
}

class B {
    constructor(a: A) {
        const boundSaySomething = this.saySomethingMyself.bind(a);
        boundSaySomething();
    }

    saySomethingMyself(this: A) {
        (this).saySomething();
    }
}

const test = new B(new A());
1
umbe1987 17 जुलाई 2020, 17:47

मुझे लगता है कि यह लिंटर के लिए बहुत भ्रमित है, मैं विरासत के साथ खेलूंगा। मैं आपको केवल किसी के रूप में डालने का सुझाव देता हूं, क्योंकि "ए" प्रकार के रूप में डालने से काम नहीं चलेगा:

saySomethingMyself() {
    (<any>this).saySomething();
}
1
Kevin ALBRECHT 17 जुलाई 2020, 16:05

आपको अपनी विधि के लिए this प्रकार को एनोटेट करना होगा।

saySomethingMyself(this: A) {

पूर्ण समाधान:

class A {
    saySomething() {
        console.log('Hello!');
    }
}

class B {
    constructor(a: A) {
        const boundSaySomething = this.saySomethingMyself.bind(a);
        boundSaySomething();
    }

    saySomethingMyself(this: A) {
        this.saySomething();
    }
}

const test = new B(new A());

खेल का मैदान

1
Karol Majewski 17 जुलाई 2020, 17:59