Error: Cannot invoke an expression whose type lacks a call signature Error: Cannot invoke an expression whose type lacks a call signature angularjs angularjs

Error: Cannot invoke an expression whose type lacks a call signature


The function that it returns has a call signature, but you told Typescript to completely ignore that by adding : any in its signature.


"Cannot invoke an expression whose type lacks a call signature."

In your code :

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

You have public toggleBody: string;. You cannot call a string as a function. Hence errors on : this.toggleBody(true); and this.toggleBody(false);


Let's break this down:

  1. The error says

    Cannot invoke an expression whose type lacks a call signature.

  2. The code:

The problem is in this line public toggleBody: string; &

it's relation to these lines:

...return this.toggleBody(true);...return this.toggleBody(false);
  1. The result:

Your saying toggleBody is a string but then your treating it like something that has a call signature (i.e. the structure of something that can be called: lambdas, proc, functions, methods, etc. In JS just function tho.). You need to change the declaration to be public toggleBody: (arg: boolean) => boolean;.

Extra Details:

"invoke" means your calling or applying a function.

"an expression" in Javascript is basically something that produces a value, so this.toggleBody() counts as an expression.

"type" is declared on this line public toggleBody: string

"lacks a call signature" this is because your trying to call something this.toggleBody() that doesn't have signature(i.e. the structure of something that can be called: lambdas, proc, functions, methods, etc.) that can be called. You said this.toggleBody is something that acts like a string.

In other words the error is saying

Cannot call an expression (this.toggleBody) because it's type (:string) lacks a call signature (bc it has a string signature.)