Ошибка функции Async: «Тип ‘Promise[]’ не может быть присвоен типу ‘MyType[]’ «

#typescript

#typescript

Вопрос:

Эта функция работала нормально, пока не была преобразована в асинхронную, а затем мои аннотации типа не были синхронизированы с момента попытки внести исправления:

 export default async function formatCallRecordsForPGPromise(
  rawCalldata: CallRecord[],
): Promise<SaveableCallRecord[]> {
  const dataSortedbyPhoneNumber: PhoneNumberKeyedCallData = lodash.groupBy(rawCalldata,
    (record: CallRecord) => record.destination);

  const phoneNumberAndGroupedData: [string, CallRecord[]][] = Object
    .entries(dataSortedbyPhoneNumber);

  const allData: Promise<SaveableCallRecord[]>[] = phoneNumberAndGroupedData
    .map(async (numberAndCallData: [string, CallRecord[]]) => {
      const phoneNumber = numberAndCallData[0];

      const selectCampaignId = 'SELECT id FROM campaign WHERE phoneNumber = $1';

      let campaign_id: number;
      try {
        campaign_id = await pgp.configured.one(
          selectCampaignId, phoneNumber, (queryResult: { id: number }) => queryResult.id,
        );
      } catch (error) {
        throw new Error(error);
      }

      const formattedDataSet: SaveableCallRecord[] = numberAndCallData[1]
        .map((record: CallRecord) => {
          const {
            date, callerid, destination, description, account, disposition, seconds, uniqueid,
          } = record;

          const formattedData: SaveableCallRecord = {
            unique_id: uniqueid,
            caller_id: callerid,
            <more 
          };

          return formattedData;
        });

      return formattedDataSet;
    });

  const allDataFlattened = allData.flat();

  return allDataFlattened;
}
  

Ошибка:

 /*
const allDataFlattened: Promise<SaveableCallRecord[]>[]
Type 'Promise<SaveableCallRecord[]>[]' is not assignable to type 'SaveableCallRecord[]'.

Type 'Promise<SaveableCallRecord[]>' is missing the following properties from type 'SaveableCallRecord': unique_id, caller_id, date, description, and 4 more.ts(2322)
*/
  

Я попробовал несколько незначительных настроек, но не могу передать аннотации без ошибок lint. Желаемый возвращаемый тип — это массив SaveableCallRecord . Кто-нибудь может увидеть проблему?

Обновить

   const allDataFlattened = (await allData).flat();
  

Я получаю эту ошибку:

 /*
const allDataFlattened: Promise<SaveableCallRecord[]>[]
Type 'Promise<SaveableCallRecord[]>[]' is not assignable to type 'SaveableCallRecord[]'.
  Type 'Promise<SaveableCallRecord[]>' is missing the following properties from type 'SaveableCallRecord': unique_id, caller_id, date, description, and 4 more.ts(2322)
*/

  

Обновление 2

   await Promise.all(allData);

  const allDataFlattened = allData.flat();

  return allDataFlattened;
  

Ошибка остается прежней.

Я все еще не уверен, как это решить, хотя я продолжаю пытаться. Приветствуется любая помощь.

Комментарии:

1. вероятно, вы забыли добавить «await» const allDataFlattened = (await allData).flat() На самом деле allData — это массив обещаний… возможно, вам придется решить их, используя что-то вроде await Promise.all(allData) удачи

Ответ №1:

Коллега сообщил мне, что компилятор TSC не может вывести разрешение обещания на allData .

Старый код

 await Promise.all(allData);

const allDataFlattened = allData.flat();

return allDataFlattened;
  
 // replace old code with:
return Promise.all(allData).then((data) => data.flat())
  

Комментарии:

1. Решение 2 бессмысленно.

2. @AluanHaddad Можете ли вы посоветовать, как это исправить, если есть способ?

3. Вы не используете результат await Promise.all(allData) . Promise.all не изменяет массив, который вы ему передаете, и ваше утверждение типа просто подавляет ошибку типа. Решение 2 никогда не будет работать

4. @AluanHaddad, хорошо, тогда я удалю его, чтобы не вводить в заблуждение других