#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, хорошо, тогда я удалю его, чтобы не вводить в заблуждение других