打字稿卷曲和异步函数

时间:2018-01-27 04:51:14

标签: typescript promise async-await currying

Typescript@4.0.0rc9

用于手动curried函数的打字稿编写定义。它们在最终返回值是非承诺时工作,但在它是承诺时失败。例如,这有效:

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
}

虽然失败了:

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的内置类型检查器表明asynctest在提供1个参数时返回的类型是(b: number) => Promise<number>按预期方式。

1 个答案:

答案 0 :(得分:0)

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

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

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(我认为这更整洁):

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)
}