Какой тип возврата подходит для функции Typescript, возвращающей функцию AsyncFunction? - PullRequest
0 голосов
/ 21 декабря 2018

Этот код должен работать ОК ...

let AsyncFunction = Object.getPrototypeOf(async function(){}).constructor;

export function createJsFunction(event: string, body: string[]): any {
  return new AsyncFunction(body.join("\n") + "\n//# sourceURL=" + event);
}

.. но «любое» возвращаемое значение createJsFunction меня оскорбляет.Какой подходящий тип для возврата?

Если я использую обычный тип Function, это, очевидно, просто Function ... но используя AsyncFunction, я получаю Cannot find name 'AsyncFunction'

1 Ответ

0 голосов
/ 21 декабря 2018

Во-первых, мы можем немного сузить тип 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>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...