此代码应该可以正常运行...
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
的“ any”返回值使我不高兴。什么是合适的返回类型?
如果我使用常规的Function
类型,显然是Function
...但是使用AsyncFunction
则会得到Cannot find name 'AsyncFunction'
答案 0 :(得分:2)
首先,我们可以稍微缩小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
。这是因为类型系统无法在编译时知道结果是什么。
如果我们知道实际的签名是什么,我们可以使用类型断言(在这里:as (event: string, body: string[]) => Promise<string>
)告诉TypeScript:
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>;