TypeScript不允许访问Firebase云函数响应数据

ffscu2ro  于 2022-12-14  发布在  TypeScript
关注(0)|答案(1)|浏览(122)

我构建了一个可调用的firebase云函数generateReport,它返回以下对象:

{
    id: string,
    fileName: string,
    numOfRows: string,
    createdOn: number
}

当我使用自定义的可重用apiCall函数从React TypeScript代码中调用它时,TypeScript不知道函数返回什么,并且在我尝试访问返回变量时抛出错误。

调用云函数的React代码

function apiCall({ functionName, payload }) {
    const request = httpsCallable(functions, functionName)
    return request(payload)
}

const response = await apiCall({
    functionName: AdminFunctions.GENERATE_REPORT, payload: {
        organisationId: organisation.id,
        projectId: project.id
    }
})

const { id, fileName, numOfRows, createdOn } = response.data // Error occurs here

我收到的错误:
类型'{}'上不存在属性'id'/'filename'/'numOfRows'/'createdOn'。
我想继续使用通用的apiCall函数。它实际上存在于一个单独的文件中,并用于我所有的API调用。
如何让TypeScript适应我尝试访问的响应变量?

p8ekf7hl

p8ekf7hl1#

您可以在调用apiCall函数时指定响应对象的类型。您可以通过为函数提供一个类型参数来完成此操作,如下所示:

function apiCall<T>({ functionName, payload }): T {
  const request = httpsCallable(functions, functionName);
  return request(payload);
}

const response = await apiCall<{
  id: string;
  fileName: string;
  numOfRows: string;
  createdOn: number;
}>({
  functionName: AdminFunctions.GENERATE_REPORT,
  payload: {
    organisationId: organisation.id,
    projectId: project.id,
  },
});

const { id, fileName, numOfRows, createdOn } = response.data;

这告诉TypeScript apiCall函数将返回一个具有指定结构的对象。然后,您可以访问返回对象的属性,而不会出现任何错误。

相关问题