त्रुटि: एक अभिव्यक्ति का आह्वान नहीं कर सकता जिसके प्रकार में कॉल हस्ताक्षर की कमी है


121

मैं टाइपस्क्रिप्ट के लिए बिल्कुल नया हूं, और मेरी दो कक्षाएं हैं। मूल कक्षा में मेरे पास है:

abstract class Component {
  public deps: any = {};
  public props: any = {};

  public setProp(prop: string): any {
    return <T>(val: T): T => {
      this.props[prop] = val;
      return val;
    };
  }
}

मेरे पास बच्चे की कक्षा में:

class Post extends Component {
  public toggleBody: string;

  constructor() {
    this.toggleBody = this.setProp('showFullBody');
  }

  public showMore(): boolean {
    return this.toggleBody(true);
  }

  public showLess(): boolean {
    return this.toggleBody(false);
  }
}

ShowMore और ShowLess दोनों मुझे त्रुटि देते हैं, "एक अभिव्यक्ति को आमंत्रित नहीं कर सकता है जिसके प्रकार में कॉल हस्ताक्षर की कमी है।"

लेकिन जो फ़ंक्शन सेट करता है, वह रिटर्न करता है, मेरे पास एक कॉल हस्ताक्षर है, मुझे लगता है? मुझे लगता है कि मैं कार्यों के टाइपिंग के बारे में कुछ महत्वपूर्ण गलत समझ रहा हूं, लेकिन मुझे नहीं पता कि यह क्या है।

धन्यवाद!


1
togglrBodyएक तार नहीं होना चाहिए, क्योंकि आप चाहते हैं कि यह एक समारोह हो
ईविन

1
@eavidan हाँ यह एक ऐसा कार्य है जो वास्तव में एक बूलियन देता है। मैंने मूल रूप से सोचा था कि यह एक स्ट्रिंग लौटाएगा। तो मैं इसे क्या बदलूं?
जस्टिन

जो भी सेटप्रॉप रिटर्न देता है, जो लगता है<T>(val: T) => T
ईवीडीएन

जवाबों:


76

फ़ंक्शन जो इसे लौटाता है उसमें कॉल सिग्नेचर होता है, लेकिन आपने टाइपस्क्रिप्ट को पूरी तरह से अनदेखा करने के लिए कहा था : any

ऐसा मत करो।


ठीक है प्रगति, धन्यवाद! अब मुझे "त्रुटि TS2322: टाइप '<T> (वैल: टी) => टी' टाइप करना आवश्यक नहीं है" बुलियन '। " अगर मैं हटा दूं: कोई। मुझे लगता है यही कारण है कि मैंने जोड़ा: पहली जगह में कोई भी। मुझे वास्तव में अभी भी मूल त्रुटियां मिलती हैं।
जस्टिन

1
मैं इस और परिवर्तन करते हैं public toggleBody: boolean;करने के लिए public toggleBody: any;यह काम करता है।
जस्टिन

1
@ जस्टिन आपको और कुछ की उम्मीद क्यों थी? आपको दावा this.toggleBodyकरना चाहिए booleanकि आपको वापस लौटना चाहिए , लेकिन setPropजो आपने इसे सौंपा है, उसके वापसी मूल्य के अनुरूप नहीं है। आपको लगता है कि आप वास्तव में क्या भेजना और वापस भेजना चाहते हैं, बिना सोचे समझे केवल प्रकारों में फेंक रहे हैं।
२१:

@jonrsharpe ठीक है हाँ जो समझ में आता है। इस मामले में यह एक बूलियन देता है, लेकिन सामान्य तौर पर यह कोई भी रिटर्न देता है। तो मुझे कोई उपयोग करना है?
जस्टिन

9
इस प्रतिक्रिया से उदाहरण के साथ, चीजों को करने का सही तरीका समझाने से लाभ होगा।
आंद्रे एम

38

"एक अभिव्यक्ति का आह्वान नहीं कर सकता है जिसके प्रकार में कॉल हस्ताक्षर की कमी है।"

आपके कोड में:

class Post extends Component {
  public toggleBody: string;

  constructor() {
    this.toggleBody = this.setProp('showFullBody');
  }

  public showMore(): boolean {
    return this.toggleBody(true);
  }

  public showLess(): boolean {
    return this.toggleBody(false);
  }
}

आपके पास है public toggleBody: string;। आप stringएक फ़ंक्शन के रूप में कॉल नहीं कर सकते । इसलिए त्रुटियों पर: this.toggleBody(true);औरthis.toggleBody(false);


28

आइए इसे तोड़ते हैं:

  1. त्रुटि कहती है

    एक ऐसी अभिव्यक्ति का आह्वान नहीं कर सकते हैं जिसके प्रकार में कॉल हस्ताक्षर की कमी है।

  2. कोड:

समस्या इस लाइन में है public toggleBody: string;और

यह इन पंक्तियों से संबंधित है:

...
return this.toggleBody(true);
...
return this.toggleBody(false);
  1. परिणाम:

आपका कहना toggleBodyएक stringलेकिन फिर आपके साथ ऐसा व्यवहार करना है जिसमें कुछ ऐसा है call signature(यानी किसी चीज़ की संरचना जिसे कहा जा सकता है: लैम्ब्डा, प्रोक, फ़ंक्शंस, मेथड, इत्यादि। जेएस में केवल फ़ंक्शन थ।)। आपको घोषणा को बदलने की आवश्यकता है public toggleBody: (arg: boolean) => boolean;

अतिरिक्त विवरण:

"आह्वान" का अर्थ है अपने फोन या एक समारोह को लागू करना।

जावास्क्रिप्ट में "एक अभिव्यक्ति" मूल रूप से कुछ है जो एक मूल्य पैदा करता है, इसलिए this.toggleBody()एक अभिव्यक्ति के रूप में गिना जाता है।

इस लाइन पर "टाइप" घोषित किया गया है public toggleBody: string

"एक कॉल हस्ताक्षर का अभाव है" यह इसलिए है क्योंकि आपके this.toggleBody()पास ऐसी चीज़ को कॉल करने की कोशिश की जा रही है जिसमें हस्ताक्षर नहीं हैं (यानी किसी चीज़ की संरचना जिसे: lambdas, proc, फ़ंक्शन, विधियाँ, आदि) कहा जा सकता है। आपने कहा कि this.toggleBodyएक ऐसी चीज है जो एक तार की तरह काम करती है।

दूसरे शब्दों में त्रुटि कह रही है

एक एक्सप्रेशन (this.toggleBody) को कॉल नहीं कर सकता क्योंकि यह टाइप (: स्ट्रिंग) में कॉल सिग्नेचर का अभाव है (bc इसमें एक स्ट्रिंग सिग्नेचर है।)


4
यह सबसे अच्छा जवाब में से एक है, कभी! मैं उन सभी परिभाषाओं को जानता हूं लेकिन जब मैंने उन सभी शब्दों को चेतावनी संदेश देखा, एक घने वाक्य में, मेरे गुच्छे मस्तिष्क के लिए बहुत अधिक थे।
चाम

6

मुझे लगता है कि तुम क्या चाहते हो:

abstract class Component {
  public deps: any = {};
  public props: any = {};

  public makePropSetter<T>(prop: string): (val: T) => T {
    return function(val) {
      this.props[prop] = val
      return val
    }
  }
}

class Post extends Component {
  public toggleBody: (val: boolean) => boolean;

  constructor () {
    super()
    this.toggleBody = this.makePropSetter<boolean>('showFullBody')
  }

  showMore (): boolean {
    return this.toggleBody(true)
  }

  showLess (): boolean {
    return this.toggleBody(false)
  }
}

महत्वपूर्ण परिवर्तन setProp(यानी, makePropSetterनए कोड में) है। आप वास्तव में वहां क्या कर रहे हैं, यह कहना है: यह एक फ़ंक्शन है, जो एक संपत्ति के नाम के साथ प्रदान किया जाता है, एक फ़ंक्शन वापस करेगा जो आपको उस संपत्ति को बदलने की अनुमति देता है।

<T>पर makePropSetterआप एक विशिष्ट प्रकार के लिए कि समारोह लॉक करने के लिए अनुमति देता है। <boolean>उपवर्ग के निर्माता में वास्तव में वैकल्पिक है। जब से आप इसे असाइन कर रहे हैं toggleBody, और इसमें पहले से ही पूरी तरह से निर्दिष्ट प्रकार है, टीएस कंपाइलर इसे अपने दम पर काम करने में सक्षम होगा।

फिर, आपके उपवर्ग में, आप उस फ़ंक्शन को कॉल करते हैं, और रिटर्न प्रकार को अब एक विशिष्ट हस्ताक्षर के साथ एक फ़ंक्शन माना जाता है। स्वाभाविक रूप से, आपको toggleBodyउसी हस्ताक्षर का सम्मान करना होगा ।


5

इसका मतलब है कि आप कुछ ऐसा करने की कोशिश कर रहे हैं जो एक फ़ंक्शन नहीं है

const foo = 'string'
foo() // error

0

अपने चर में एक प्रकार जोड़ें और फिर वापस लौटें।

उदाहरण के लिए:

const myVariable : string [] = ['hello', 'there'];

const result = myVaraible.map(x=> {
  return
  {
    x.id
  }
});

=> महत्वपूर्ण भाग स्ट्रिंग जोड़ रहा है [] प्रकार आदि:


0

मेरे पास एक ही त्रुटि संदेश था। मेरे मामले में मैंने अनजाने में ES6 export default function myFuncसिंटैक्स को मिलाया था const myFunc = require('./myFunc');

का उपयोग कर module.exports = myFunc;के बजाय समस्या हल हो जाती।


0

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

private IMadeAMistakeHere(): void {
    let mynumber = this.SuperCoolNumber();
}

private IDidItCorrectly(): void {
    let mynumber = this.SuperCoolNumber;
}

private get SuperCoolNumber(): number {
    let response = 42;
    return response;
};
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.