什么';返回异步函数的Typescript函数的适当返回类型是什么?

什么';返回异步函数的Typescript函数的适当返回类型是什么?,typescript,async-await,Typescript,Async Await,这个代码应该可以正常工作 let AsyncFunction = Object.getPrototypeOf(async function(){}).constructor; export function createJsFunction(event: string, body: string[]): any { return new AsyncFunction(body.join("\n") + "\n//# sourceURL=" + event); } 。。但是createJsF

这个代码应该可以正常工作

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”返回值冒犯了我。返回的合适类型是什么


如果我使用的是常规的
函数
类型,那么它显然只是
函数
。。。但是使用
AsyncFunction
我得到
找不到名称“AsyncFunction”
首先,我们可以稍微缩小
AsyncFunction的类型。内置类型表示它是
any
,但我们知道它实际上是一个
FunctionConstructor

let AsyncFunction: FunctionConstructor = Object.getPrototypeOf(async function () {}).constructor;
现在我们可以像使用标准的
函数
构造函数一样使用它

const createJsFunction = new AsyncFunction('event', 'body', `
  await body.join('\\n') + '\\n//# sourceURL=' + event
`);
(请注意模板字符串中的双反斜杠。)

这是可行的,但是
createJsFunction
的推断类型只是
Function
。这是因为类型系统无法判断编译时的结果

如果我们知道实际的签名是什么,我们可以通过使用类型断言(这里:
as(event:string,body:string[])=>Promise
)告诉TypeScript:


首先,我们可以稍微缩小
AsyncFunction
的类型。内置类型表示它是
any
,但我们知道它实际上是一个
FunctionConstructor

let AsyncFunction: FunctionConstructor = Object.getPrototypeOf(async function () {}).constructor;
现在我们可以像使用标准的
函数
构造函数一样使用它

const createJsFunction = new AsyncFunction('event', 'body', `
  await body.join('\\n') + '\\n//# sourceURL=' + event
`);
(请注意模板字符串中的双反斜杠。)

这是可行的,但是
createJsFunction
的推断类型只是
Function
。这是因为类型系统无法判断编译时的结果

如果我们知道实际的签名是什么,我们可以通过使用类型断言(这里:
as(event:string,body:string[])=>Promise
)告诉TypeScript:


是的createJsFunction是一个常规函数,它应该返回一个异步函数。但是您确定自动返回承诺的函数是异步的吗??当然不能在非显式异步的函数中使用
await
?请参见此处基于MDN的JSBin。(我知道我已经回到Javascript来尝试并理解这一点!)将Function()调用替换为AsyncFunction(),它可以正常工作。感谢您回复我。通过假设自动为异步函数,我的意思是它们在类型级别上都是相同的。换句话说,所有这些都符合相同的类型签名:type(
AsyncFunction=(…args:any[])=>Promise
):
const-foo:AsyncFunction=()=>Promise.resolve(0)
const-bar:AsyncFunction=async()=>0
const-baz:AsyncFunction=async function(){return 0;}
。我不知道你想
在你的函数体内等待
——我会修改我的答案,这样以后就不会有人困惑了。回来有点晚,但我需要的是<代码>导出函数createJsFunction(事件:string,body:string[]):函数{返回新的异步函数(body.join(“\n”)+“\n/#sourceURL=“+event”);}
。你的回答为我指明了正确的方向。返回类型是Function而不是AsyncFunction,但不管怎样,它似乎都可以工作。值得注意的是,Typescript需要Target=ES2017或更高版本以这种方式生成一个异步函数。实际上,它一文不值!返回类型为
Function
,因为没有名为
AsyncFunction
的类型。我们只有一个名为
AsyncFunction
的变量,类型为
Function
。您正在使用的构造函数也被定义为返回
函数
。这就是为什么类型断言有时很有用的原因。是的,createJsFunction是一个常规函数,应该返回一个异步函数。但是您确定自动返回承诺的函数是异步的吗??当然不能在非显式异步的函数中使用
await
?请参见此处基于MDN的JSBin。(我知道我已经回到Javascript来尝试并理解这一点!)将Function()调用替换为AsyncFunction(),它可以正常工作。感谢您回复我。通过假设自动为异步函数,我的意思是它们在类型级别上都是相同的。换句话说,所有这些都符合相同的类型签名:type(
AsyncFunction=(…args:any[])=>Promise
):
const-foo:AsyncFunction=()=>Promise.resolve(0)
const-bar:AsyncFunction=async()=>0
const-baz:AsyncFunction=async function(){return 0;}
。我不知道你想
在你的函数体内等待
——我会修改我的答案,这样以后就不会有人困惑了。回来有点晚,但我需要的是<代码>导出函数createJsFunction(事件:string,body:string[]):函数{返回新的异步函数(body.join(“\n”)+“\n/#sourceURL=“+event”);}。你的回答为我指明了正确的方向。返回类型是Function而不是AsyncFunction,但不管怎样,它似乎都可以工作。值得注意的是,Typescript需要Target=ES2017或更高版本以这种方式生成一个异步函数。实际上,它一文不值!返回类型为
Function
,因为没有名为
AsyncFunction
的类型。我们只有一个名为
AsyncFunction
的变量,类型为
Function
。您正在使用的构造函数也被定义为返回
函数
。这就是为什么类型断言有时是有用的。