. 您好,在以下代码的帮助下,我尝试通过异步查询检索“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() 方法来完成……但这似乎还不够。问题显然是打字,但我看不出问题出在哪里。
代码的问题是 toEtablissementsList 函数返回一个 Promise 而不是 Etablissement 对象数组。
试试这个:
const toEtablissementsList = (ouList: string[]): Promise<Etablissement[]> => {
return Promise.all(
ouList.map((ou) => {
try {
const uai = fromOuToUai(ou);
return getOneEtablissement(uai);
} catch (error) {
return Promise.reject(error);
}
})
).then((etabList) => etabList.filter((etab) => !!etab));
};
代码最后一行的问题是
etabList
是一个解析为 Etablissement[]
数组的 Promise,而不是 Etablissement 对象数组。这是因为 Promise.all()
返回一个承诺,该承诺解析为输入承诺的已解决值的数组。
您需要修改您的
toEtablissementsList()
函数以等待Promise.all()
调用的解析,然后返回生成的Etablissement[]
数组。您还可以通过删除不必要的 try-catch 块来简化代码。
像这样的东西:
const toEtablissementsList = async (ouList: string[]): Promise<Etablissement[]> => {
const etabListPromises = ouList.map(ou => {
const uai = fromOuToUai(ou);
return getOneEtablissement(uai);
});
const etabList = await Promise.all(etabListPromises);
return etabList;
}
您可以通过映射
Promise<Etablissement>
数组并为每个ouList
调用getOneEtablissement(
)来创建uai
对象的数组。然后使用Promise.all()
等待所有的promise resolve,返回结果Etablissement[]
数组。
还将
toEtablissementsList()
的返回类型更改为 Promise<Etablissement[]>
,因为该函数是异步的并返回一个 Promise
。