类型“Promise<(string[] | undefined)[]>”缺少类型“Etablissement[]”中的以下属性:length、pop、push、concat 和另外 29 个

问题描述 投票:0回答:2

. 您好,在以下代码的帮助下,我尝试通过异步查询检索“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() 方法来完成……但这似乎还不够。问题显然是打字,但我看不出问题出在哪里。

reactjs typescript asynchronous promise
2个回答
0
投票

代码的问题是 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));
};

0
投票

代码最后一行的问题是

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

© www.soinside.com 2019 - 2024. All rights reserved.