首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Typescript Currying和Async函数

Typescript Currying和Async函数
EN

Stack Overflow用户
提问于 2018-01-27 12:51:14
回答 1查看 1K关注 0票数 1

Typescript@4.0.0rc9

在打字脚本编写定义中,用于手工编写的函数。当最终返回值为非promise时,它们可以工作,但当返回值为promise时,它们会失败。例如,这是可行的:

代码语言:javascript
复制
function test (
  a: number,
): (
  b: number,
) => number
function test (
  a: number,
  b: number,
 ):  number
function test (a, b?) {
  if (b === undefined)
    return function (b: number) { test(a, b) }
  return a + b
}

虽然这样做失败了:

代码语言:javascript
复制
function asynctest (
  a: number,
): (
  b: number,
) => Promise<number>
function asynctest (
  a: number,
  b: number,
 ):  Promise<number>
async function asynctest (a, b?) {
  if (b === undefined)
    return function (b: number) { return asynctest(a, b) }
  return await a + b
}

VSCode的内置类型检查器表明,当提供1个参数时,asynctest返回的类型如预期的那样为(b: number) => Promise<number>

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-27 12:51:14

在写这个问题的过程中,我解决了它。

异步函数必须返回promise,因此在传递一个参数的情况下,它返回的不是函数,而是函数的Promise。因此,正确的异步等待版本是:

代码语言:javascript
复制
function asynctest (
  a: number,
): Promise<(
  b: number,
) => Promise<number>>
function asynctest (
  a: number,
  b: number,
 ):  Promise<number>
async function asynctest (a, b?) {
  if (arguments.length === 1)
    return function (b: number) { return asynctest(a, b) }
  return await a + b
}

另一种版本是直接使用promises,而不是使用async-await (我认为这更简洁):

代码语言:javascript
复制
function promisetest (
  a: number,
): (
  b: number,
) => Promise<number>
function promisetest (
  a: number,
  b: number,
 ):  Promise<number>
function promisetest (a, b?) {
  if (arguments.length === 1)
    return function (b: number) { return promisetest(a, b) }
  return new Promise(a + b)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48472708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档