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>
按预期方式。
答案 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)
}