Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Typescript: This expression is not callable. Type '{ getUserInfo(requestData: object): Promise<object>; }' has no call signatures

I am having following issue, when i call to another function in typescript

This expression is not callable. Type '{ getUserInfo(requestData: object): Promise; }' has no call signatures. in my index.ts

index.ts

  const fetchApiData = await getUserInfo(requestData)

service.ts

import { userInfoApi } from '../constants/api'
import request from '../utils/request'

export default {
  async getUserInfo(requestData: object): Promise<object> {
    return await request(userInfoApi, requestData, 'GET')
  },
}

request.ts

const request = (operation: string, data: object, method: any): Promise<object> => {
  return new Promise(function(resolve, reject) {
    my.request({
      url: operation,
      data: data,
      method: method,
      success: function(res) {
        resolve(res)
      },
      fail: function(err) {
        reject(err)
      },
    })
  })
}

export default (operation: string, data: object, method: any): Promise<any> => {
  let timeHandle
  const timeout = 65 * 1000
  const promiseTimeout = new Promise(resolve => {
    timeHandle = setTimeout(() => {
      resolve({
        success: false,
        errorCode: 'NETWORK_TIMEOUT',
        errorMessage: 'Network Timeout',
      })
    }, timeout)
  })

  return Promise.race([
    request(operation, data, method).then(result => {
      clearTimeout(timeHandle)
      return result
    }),
    promiseTimeout,
  ])
}

Any idea how to fix it?

like image 540
Chan Yoong Hon Avatar asked Mar 30 '20 06:03

Chan Yoong Hon


2 Answers

The error is valid.

Fix option 1 : Fix at call

Based on your error Type '{ getUserInfo(requestData: object): Promise; }' has no call signatures instead of calling something(requestData) you should be calling something.getUserInfo(requestData).

Fix option 2 : Fix at definition

Change:

export default {
  async getUserInfo(requestData: object): Promise<object> {
    return await request(userInfoApi, requestData, 'GET')
  },
}

to

export default async function getUserInfo(requestData: object): Promise<object> {
    return await request(userInfoApi, requestData, 'GET')
};
like image 110
basarat Avatar answered Nov 15 '22 01:11

basarat


In my case this was happening on TS 4.5 with the new Node ES Modules support. Basically, modules written in CommonJs import as objects, and default exports are not supported. To access what's proably the default export, in my case a function, use the .default property

Instead of

import chariot from 'EastIndiaCo'

I had to use:

import chariotPkg from 'EastIndiaCo'
const chariot = chariotPkg.default

To fix this upstream, the maintainer of EastIndiaCo should probably define package.json exports for modules.

Source: https://nodejs.org/api/packages.html#packages_exports

like image 3
Ray Foss Avatar answered Nov 15 '22 00:11

Ray Foss