。你好,在下面代码的帮助下,我尝试通过异步查询检索“Etablissement”表。最后一行带有红色下划线,并显示以下消息:Type 'Promise<(string[] | undefined)[]>' is missing the following properties from type 'Establishment[]': length, pop, push, concat, and 29 more.
如果任何人有一个想法,任何解决方案的建议将不胜感激。提前感谢您的帮助。
下面是一个代码片段:
interface GetApplicationHook {
getApplication: (id?: string) => Promise<ApplicationToSave>
defaultApplication: ApplicationToSave
getOneEtablissement: (uai?: string) => Promise<Etablissement>
toEtablissementsList: (ouList: string[]) => Etablissement[]
}
[...]
const getOneEtablissement = (uai?: string): Promise<Etablissement> => {
if (uai) {
return loadOneEtablissement(uai)
.then((etab: Etablissement) => {
return {
nom: etab.nom,
uai: etab.uai,
ou: etab.ou,
description: etab.description,
}
})
.catch(() => Promise.reject("Erreur à la récupération de l'établissement=" + uai))
}
return Promise.resolve(defaultEtablissement)
}
const fromOuToUai = (ou: string): string => {
try {
return ou.split(',')[0].split('=')[1]
} catch (error) {
return ou
}
}
const toEtablissementsList = (ouList: string[]): Etablissement[] => {
const etabList = Promise.all(
ouList.map(ou => {
try {
const uai = fromOuToUai(ou)
getOneEtablissement(uai)
.then((data: Etablissement) => data)
.catch(() => Promise.reject())
} catch (error) {
return ouList
}
})
)
return etabList
}
[...]
我一直在寻找关于Promises
如何工作以及如何从中提取感兴趣的数据的信息。如果我理解正确的话,这应该通过.then()方法沿着.catch()方法来完成...但这似乎还不够。问题显然是关于键入,但我不明白问题出在哪里。
4条答案
按热度按时间eufgjt7s1#
代码最后一行的问题是
etabList
是解析为Etablissement[]
数组而不是Etablissement对象数组的Promise。这是因为Promise.all()
返回解析为输入Promise的解析值数组的Promise。您需要修改
toEtablissementsList()
函数,等待Promise.all()
调用解析,然后返回生成的Etablissement[]
数组。您还可以通过删除不必要的try-catch块来简化代码。大概是这样的
你可以创建一个
Promise<Etablissement>
对象的数组,方法是Map到ouList
数组上,并为每个uai
调用getOneEtablissement(
)。然后使用Promise.all()
等待所有承诺解析,并返回结果Etablissement[]
数组。还将
toEtablissementsList()
的返回类型更改为Promise<Etablissement[]>
,因为该函数是异步的并且返回Promise
。***针对请求编辑:***要从Promise〈Etablissement[]〉中提取Etablissement[],您需要使用await关键字或then()方法等待解析该Promise。
0pizxfdo2#
代码的问题在于toEtablissementsList函数返回的是Promise,而不是Etablissement对象数组。
试试这个:
t9aqgxwy3#
以下是完整的组件代码,如果有帮助的话(底部的属性listOrganisations需要是Etablissement[]):
jc3wubiy4#
嗨,谢谢你的回答,
我最终使用了本吉建议的函数,之后我在我的代码中做了一些其他的修改。如果它能帮助任何人,这里是最终的结果。
祝你愉快!