【问题标题】:Typescript: This expression is not callable. Type '{ getUserInfo(requestData: object): Promise<object>; }' has no call signatures打字稿:此表达式不可调用。类型 '{ getUserInfo(requestData: object): Promise<object>; }' 没有调用签名
【发布时间】:2020-07-10 11:50:52
【问题描述】:

当我在打字稿中调用另一个函数时遇到以下问题

此表达式不可调用。 类型 '{ getUserInfo(requestData: object): Promise; }' 没有调用签名。 在我的 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,
  ])
}

知道怎么解决吗?

【问题讨论】:

  • 检查 index.ts 中的导入语句

标签: typescript asynchronous service


【解决方案1】:

错误是有效的。

修复选项 1:调用修复

根据您的错误Type '{ getUserInfo(requestData: object): Promise; }' has no call signatures 而不是调用something(requestData),您应该调用something.getUserInfo(requestData)

修复选项 2:在定义处修复

变化:

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

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

【讨论】:

    【解决方案2】:

    改成

    service.ts

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

    index.ts

    import getUserInfo from 'service.ts'
    

    【讨论】:

      【解决方案3】:

      在我的例子中,这发生在 TS 4.5 上,支持新的 Node ES 模块。基本上,用 CommonJs 编写的模块作为对象导入,不支持默认导出。要访问可能是默认导出的内容,在我的例子中是一个函数,请使用 .default 属性

      而不是

      import chariot from 'EastIndiaCo'
      

      我不得不使用:

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

      为了解决这个上游问题,EastIndiaCo 的维护者可能应该为模块定义 package.json 导出。

      来源:https://nodejs.org/api/packages.html#packages_exports

      【讨论】:

        猜你喜欢
        • 2021-02-21
        • 2020-09-09
        • 2020-08-08
        • 2020-12-27
        • 1970-01-01
        • 1970-01-01
        • 2021-10-11
        • 1970-01-01
        • 2021-10-30
        相关资源
        最近更新 更多