ত্রুটি: একটি অভিব্যক্তি চাওয়া যায় না যার ধরণের কল স্বাক্ষরের অভাব রয়েছে


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);
  }
}

শো-মোর এবং শোর লেস উভয়ই আমাকে ত্রুটি দেয়, "এমন কোনও অভিব্যক্তি চাওয়া যায় না যার ধরণের কল স্বাক্ষরের অভাব রয়েছে।"

তবে সেট ফর্মটি যে ফাংশনটি ফিরিয়ে দেয় তাতে কি একটি কল স্বাক্ষর থাকে, আমার মনে হয়? আমি মনে করি ফাংশনগুলির টাইপিং সম্পর্কে আমি গুরুত্বপূর্ণ কিছু ভুল বুঝছি, তবে এটি কী তা আমি জানি না।

ধন্যবাদ!


1
togglrBodyস্ট্রিং হওয়া উচিত নয়, যেহেতু আপনি এটি কোনও ফাংশন হতে চান
ইভিডান

1
@ এভিডান হ্যাঁ এটি এমন একটি ফাংশন যা আসলে একটি বুলিয়ান দেয়। আমি মূলত ভেবেছিলাম এটি একটি স্ট্রিং ফিরে আসবে। তাহলে আমি কী এটিকে পরিবর্তন করব?
জাস্টিন 21

যাই হোক না কেন সেটপ্রপ ফিরে আসে, যা দেখে মনে হয়<T>(val: T) => T
ইভিডান

উত্তর:


76

এটি যে ফাংশনটি ফিরিয়ে দেয় তাতে একটি কল স্বাক্ষর রয়েছে তবে আপনি টাইপস্ক্রিপ্টকে : anyতার স্বাক্ষর যুক্ত করে এটি সম্পূর্ণ উপেক্ষা করতে বলেছেন ।

এটা করবেন না।


ঠিক আছে অগ্রগতি, ধন্যবাদ! এখন আমি পেয়েছি "ত্রুটি টিএস 2322: টাইপ '<T> (ভাল: টি) => টি' 'বুলিয়ান' টাইপ করার যোগ্য নয়" " আমি যদি অপসারণ করি: যে কোনও। আমি মনে করি এই কারণেই আমি যুক্ত করেছি: যে কোনও স্থানে। আমি আসলে এখনও মূল ত্রুটিগুলি পেতে।
জাস্টিন 21

1
আমি যদি এটি করি এবং এতে পরিবর্তন public toggleBody: boolean;হয় তবে public toggleBody: any;তা কার্যকর হয়।
জাস্টিন 21

1
@ জাস্টিন আপনি কেন অন্য কিছু আশা করেছিলেন? আপনার দাবি this.toggleBodyফিরিয়ে নেওয়া উচিত boolean, তবে setPropএটি আপনি যে দায়িত্ব দিয়েছেন তার ফেরতের মূল্যের সাথে সামঞ্জস্য নয়। আপনি আসলে কী পাঠাতে এবং ফিরে আসতে চান তা ভেবেই আপনি এলোমেলোভাবে প্রকারভেদে ছুটে যাচ্ছেন বলে মনে হয়।
jonrsharpe

@ জোনারশপে ঠিক আছে হ্যাঁ তা বোঝা যায় না। এই ক্ষেত্রে এটি একটি বুলিয়ান দেয়, তবে সাধারণভাবে এটি কোনও দেয় returns সুতরাং আমি কোন ব্যবহার করতে হবে?
জাস্টিন 21

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(।: Lambdas, proc, ফাংশন, পদ্ধতি, ইত্যাদি জাতীয় শুধু হউক না কেন কাজ অর্থাত এমন কিছু বিষয় যা বলা যেতে পারে কাঠামো)। আপনাকে ঘোষণাপত্রটি পরিবর্তন করতে হবে public toggleBody: (arg: boolean) => boolean;

অতিরিক্ত বিশদ:

"আহ্বান" অর্থ আপনার কল করা বা কোনও ফাংশন প্রয়োগ করা।

জাভাস্ক্রিপ্টে "একটি অভিব্যক্তি" মূলত এমন কিছু যা মান তৈরি করে, তাই this.toggleBody()একটি অভিব্যক্তি হিসাবে গণনা করা হয়।

"টাইপ" এই লাইনে ঘোষণা করা হয় public toggleBody: string

"একটি কল স্বাক্ষরের অভাব রয়েছে" এর কারণ this.toggleBody()এটি এমন কিছু কল করার চেষ্টা করছেন যাতে স্বাক্ষর নেই (যেমন এমন কোনও কাঠামোর যা বলা যেতে পারে: ল্যাম্বডাস, প্রোক, ফাংশন, পদ্ধতি ইত্যাদি) যা বলা যেতে পারে। আপনি বলেছিলেন this.toggleBodyএমন কিছু যা স্ট্রিংয়ের মতো কাজ করে।

অন্য কথায় ত্রুটিটি বলছে

কোনও এক্সপ্রেশন (এটি.টগলবিডি) কল করতে পারে না কারণ এটি টাইপ (: স্ট্রিং) এর একটি কল স্বাক্ষরের অভাব রয়েছে (বিসি এর একটি স্ট্রিং স্বাক্ষর রয়েছে))


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একই স্বাক্ষরটির শ্রদ্ধা থাকতে হবে ।



0

আপনার চলকটিতে একটি প্রকার যুক্ত করুন এবং তারপরে ফিরে আসুন।

উদাহরণ:

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

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

=> গুরুত্বপূর্ণ অংশটি স্ট্রিং [] টাইপ ইত্যাদি যুক্ত করছে:


0

আমি একই ত্রুটি বার্তা ছিল। আমার ক্ষেত্রে আমি অজান্তেই ইএস 6 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;
};
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.