“() => Promise<string>”类型的参数不可分配给 'Promise<string>' 类型的参数。 TS(2345)

Argument of type '() => Promise<string>' is not assignable to parameter of type 'Promise<string>'. ts(2345)

我正在定义一个需要异步函数作为参数的函数:

async function handle(def: Promise<string>) {
    // ...
    const data = await def;
    console.log(`data equals: ${data}`)
}

我可以通过一个承诺来成功执行它。

handle(new Promise(async (res, rej) => {
    const data = await Promise.resolve("some data")
    if (data == "invalid")
        return rej("data is invalid")
    res(data)
}))

我需要内部函数是异步的,因为我需要在内部执行等待。但是,我不喜欢 promise 中的异步,并在网上阅读 .

我认为摆脱 promise 并使用基本的异步函数是一个更好的主意:

handle(async () => {
    const data = await Promise.resolve("some data")
    if (data == "invalid")
        throw "data is invalid"
    return data
})

但是 TS 编译器报错:

Argument of type '() => Promise<string>' is not assignable to parameter of type 'Promise<string>'. ts(2345)

我认为 Promises 和异步函数在某种程度上可以互换。我读到异步函数 always return a promise。显然我没有正确解释这个,但我不确定错误告诉我什么。

我希望我正在勾画的问题很清楚。如果有人可以澄清错误或就如何以所需方式实施此错误提出建议,我们将不胜感激。非常感谢!

一般来说,在这种情况下使用 Promise 构造函数的时间是在您调用要承诺的 callback-based 函数时。但是在这里,看起来没有什么可以承诺的,所以 Promise 构造函数并没有真正帮助。

如果

I need the inner-function to be async, since I need to perform awaits inside.

您可以立即调用异步 IIFE - 是的,对 Promise 构造函数使用异步回调是不安全的,因为它不会处理错误。

handle((async () => {
    const data = await Promise.resolve("some data")
    if (data == "invalid")
        throw "data is invalid";
    return data
})())

另一种选择是使用 .then - .then 在许多情况下可与 await 互换:

handle(
  Promise.resolve("some data")
    .then((data) => {
        if (data == "invalid")
            throw "data is invalid";
        return data;
    })
);

您的函数签名似乎不正确。 您将参数定义为 Promise<string>,而您确实希望它是 () => Promise<string>.

async function handle(def: () => Promise<string>) {
    // ...
    const data = await def();
    console.log(`data equals: ${data}`)
}