无法在Typescript中映射数组

时间:2019-12-12 16:14:15

标签: reactjs typescript

我正在尝试在Typescript中的数组上使用.map()函数。

我运行以下代码:

Unhandled Rejection (TypeError): Cannot read property 'map' of undefined

在控制台中,我得到了预期的结果,而且看起来工作正常,但是程序崩溃了,并出现以下错误:

export default function promiseFunction(){
    return new Promise<any[]>(function(resolve, reject){
        const { data, loading, error, fetchMore } = useQuery(
            QUERY,
            {
                variables: {
                    first: 15,
                    offset: 0
                },
                errorPolicy: 'all'
            });

            if(data){
                resolve(data.getData);
            }
            else if(error){
                reject("broke");
            }

    })

}

我认为这是因为Typescript不知道Data是一个数组,但是我已经在上面建立了它。所以我很困惑。

任何帮助将不胜感激,谢谢。

**编辑1:添加了promise函数主体**

  #Caching for DEV

  if("ENV_MODE" = DEV) {

  }

2 个答案:

答案 0 :(得分:3)

该错误发生在运行时,而不是编译时。因此,打字稿并未真正涉及。 Promisefunction返回的promise显然是不是解析为数组。 Typescript对此一无所知,因为它只知道您在编译时提供给它的信息,而且该信息显然存在缺陷。如果您可以共享Promisefunction的代码,我们也许可以对其进行诊断。

编辑:使用您的最新更新,可以更多地指示出什么地方出了问题,但是还出现了一些新问题。您正在尝试在任意函数内使用React钩子。不支持。挂钩只能在功能组件内部以及其他挂钩内部使用。

因此,您的代码正在运行,然后在不希望被调用的上下文中调用useQuery。使用查询将返回其中没有数据的数据对象,并且您可以使用未定义的条件来解决诺言。您可能已经告诉打字稿它是Promise<any[]>,但这是不正确的。由于您给打字稿提供了不正确的信息,因此从此以后,它将假设信息不正确,从而导致您在尝试进行data.map

时无法指出您的问题

我很难向您推荐一个解决方案,因为您似乎滥用了手头的工具。我不明白您为什么首先要在承诺中使用钩子。

答案 1 :(得分:1)

TypeScript无法根据上下文确定Promise解析的内容(请参见:this),因此您必须声明它。

类似的东西:

function getARPTable() {
return new Promise<any[]>((resolve, reject) => {
    arp.table((error, devices) => {
        if (error) reject(error);
        else resolve(devices);
    });
});
}