This expression is not callable. Type 'Number' has no call signatures

avatar

Borislav Hadzhiev

Last updated: Mar 5, 2022

banner

Photo from Unsplash

This expression is not callable. Type Number has no call signatures #

The "This expression is not callable. Type 'Number' has no call signatures" TypeScript error occurs when we try to call a number as a function or have typed a function as a number. To solve the error, make sure you're calling a function and it is typed as a function.

Here is an example of how the error occurs.

index.ts
const num = 100; // ⛔️ Error: This expression is not callable. // Type 'Number' has no call signatures.ts(2349) num();

The example above shows how trying to call a number as a function causes the error. The same is the case with any other type that is not callable.

You could be forgetting to access a built-in method on the number.

index.ts
const num = 100; console.log(num.toFixed(2)); // 👉️ "100.00"

Make sure to access any built-in methods as num.someMethod(), and not num().

The best way to start debugging is to console.log the thing you're trying to call.

If you console.log the value and it is a function, then maybe your typings are incorrect.

Hover over the function you're trying to invoke and make sure it has a type of function.

index.ts
function getFunc(): any { return (a: number, b: number) => { return a + b; }; } // 👇️ const result: number const result = getFunc() as number; // ⛔️ Error: This expression is not callable. // Type 'Number' has no call signatures.ts(2349) result(15, 15);

The example above shows how somehow the function got assigned a different type (a number) somewhere in the codebase (most commonly caused by using type assertions).

Even though the result variable stores a function, we have told TypeScript that the type of the stored value is a number, and numbers have no call signatures.

Here are some examples of how to type a function using a type alias or an interface.

index.ts
// 👇️ using Type Alias (for only function) 👇️ type FunctionA = (a: number, b: number) => number; const funcA: FunctionA = (a, b) => a + b; console.log(funcA(25, 25)); // 👇️ Using interface (for only function) 👇️ interface FunctionB { (a: number, b: number): number; } const funcB: FunctionB = (a, b) => a + b; console.log(funcB(30, 30)); // 👇️ Type Alias with other members 👇️ type DateThings = { date: string; getTimestamp: (str: string) => number; }; const d: DateThings = { date: '2023-09-24', getTimestamp(str) { return new Date(str).getTime(); }, }; console.log(d.getTimestamp('2024-04-16')); // 👇️ Interface with other members 👇️ interface MathThings { sum: (a: number, b: number) => number; num: number; } const obj: MathThings = { num: 100, sum(a, b) { return a + b; }, }; console.log(obj.sum(45, 45));

The first two examples show how you would correctly type a function using a type alias or an interface that only represents a single function.

The second two examples show how to use a type alias or an interface to type an object that contains a function property.

To solve the "This expression is not callable. Type 'Number' has no call signatures" TypeScript error:

  1. Make sure the value you are calling as a function is an actual function.
  2. Make sure the function is typed correctly.
  3. TypeScript won't let you call a function that is typed as something else.
I wrote a book in which I share everything I know about how to become a better, more efficient programmer.
book cover
You can use the search field on my Home Page to filter through all of my articles.