我正在尝试在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) {
}
答案 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);
});
});
}