Во-первых, мы можем немного сузить тип AsyncFunction
.Встроенные наборы говорят, что это any
, но мы знаем, что это действительно FunctionConstructor
.
let AsyncFunction: FunctionConstructor = Object.getPrototypeOf(async function () {}).constructor;
Теперь мы можем использовать его так же, как мы использовали бы стандартный конструктор Function
.
const createJsFunction = new AsyncFunction('event', 'body', `
await body.join('\\n') + '\\n//# sourceURL=' + event
`);
(Обратите внимание на двойной обратный слеш внутри строки шаблона.)
Это работает, но выводимый тип для createJsFunction
- это просто Function
.Это связано с тем, что система типов не может сказать, каким будет результат во время компиляции.
Если мы знаем, какой будет действительная подпись, мы можем сообщить об этом TypeScript, используя типутверждение (здесь: as (event: string, body: string[]) => Promise<string>
):
const createJsFunction = new AsyncFunction('event', 'body', `
body.join('\\n') + '\\n//# sourceURL=' + event
`) as (event: string, body: string[]) => Promise<string>;
Как вы упомянули в своем комментарии, преимущество использования конструктора AsyncFunction
заключается в том, что вы можете await
внутри функции, которую вы строите.
const createJsFunction = new AsyncFunction('event', 'body', `
await body.join('\\n') + '\\n//# sourceURL=' + event
`) as (event: string, body: string[]) => Promise<void>;