Ошибка машинописного текста в асинхронной функции: «Обещание<строка[]" не соответствует подписи " (строки: строка[]): Обещание»

#javascript #reactjs #typescript #refactoring

Вопрос:

У меня есть рабочий код, но мне нужно провести рефакторинг функции, чтобы сделать ее многоразовой. Я не очень хорошо знаком с машинописным текстом или клиентом.запросы и обещания, поэтому рефакторинг оказался сложным.

Что работало:

 if (rows) {
            const headerTranslation = async (headerRows: string[]) => {
              const { data: translatedRows } = await client
                .query<CompileRowsForProgramQuery>(HANDLEBARS_COMPILE_QUERY, {
                  originalTexts: headerRows,
                  programId,
                })
                .toPromise();
              return translatedRows?.programCompiledTexts;
            };
downloadJsonAsCsv(
              rows,
              `${programName}-program-${programId}-${surveyId}-responses.csv`,
              headerTranslation
            );
}
 

Я пытаюсь вытащить функцию в файл utils следующим образом:

 export default async function HandlebarsCompileQuery(
  client: Client,
  headerRows: string[],
  programId: string
) {
  const { data: translatedRows } = await client
    .query<CompileRowsForProgramQuery>(HANDLEBARS_COMPILE_QUERY, {
      originalTexts: headerRows,
      programId,
    })
    .toPromise();
  return translatedRows?.programCompiledTexts;
}
 

И назови это так:

 if (rows) {
            const headerTranslation = await HandlebarsCompileQuery(client, rows, programId);
            downloadJsonAsCsv(
              rows,
              `${programName}-program-${programId}-${surveyId}-responses.csv`,
              headerTranslation
            );
}
 

Но я сталкиваюсь с ошибкой машинописи, подчеркивающей headerTranslation :
Argument of type 'Promise<string[] | undefined>' is not assignable to parameter of type '(rows: string[]) => Promise<string[] | undefined>'.
Type 'Promise<string[] | undefined>' provides no match for the signature '(rows: string[]): Promise<string[] | undefined>'.

Типы загрузокJsonAsCsv являются:

 export default async function downloadJsonAsCsv<T extends Record<string, unknown>>(
  rows: T[],
  fileName: string,
  headerTranslation?: (rows: string[]) => Promise<string[] | undefined>
)
 

Любые рекомендации или ресурсы были бы весьма признательны.

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

1. Прежде всего, вам нужно использовать await перед HandlebarsCompileQuery (), когда вы вызываете его, и это строки типа string[] ?

2. @ErwinvanHoof спасибо — добавлено await перед вызовом HandlebarsCompileQuery(). Да, rows это массив строк (более конкретно, это массив типа SurveyResponse[])

Ответ №1:

Мне нужно было вернуть функцию внутри моей функции 🙂

 export default function HandlebarsCompileQuery(
  client: Client,
  programId: string
) {
  return async function (rows: string[]) {
    const { data: translatedRows } = await client
      .query<CompileRowsForProgramQuery>(HANDLEBARS_COMPILE_QUERY, {
        originalTexts: rows,
        programId,
      })
      .toPromise();
    return translatedRows?.programCompiledTexts;
  };
}
 

И я дополнительно устранил необходимость в headerRows

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

1. Ты сам все понял! 👍