#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. Ты сам все понял! 👍