打字稿:此表达式不可调用。类型 '{ getUserInfo(requestData: object): Promise<object>; }' 没有调用签名

Cha*_*Hon 5 service asynchronous typescript

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

此表达式不可调用。类型 '{ getUserInfo(requestData: object): Promise; }' 没有调用签名。在我的 index.ts

索引.ts

  const fetchApiData = await getUserInfo(requestData)
Run Code Online (Sandbox Code Playgroud)

服务.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')
  },
}
Run Code Online (Sandbox Code Playgroud)

请求文件

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,
  ])
}
Run Code Online (Sandbox Code Playgroud)

知道如何修复它吗?

bas*_*rat 19

该错误是有效的。

修复选项 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')
  },
}
Run Code Online (Sandbox Code Playgroud)

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


Ray*_*oss 12

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

代替

import chariot from 'EastIndiaCo'
Run Code Online (Sandbox Code Playgroud)

我不得不使用:

import chariotPkg from 'EastIndiaCo'
const chariot = chariotPkg.default
Run Code Online (Sandbox Code Playgroud)

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

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