【问题标题】:Generic promise wrapper for async functions异步函数的通用承诺包装器
【发布时间】:2021-06-17 10:52:33
【问题描述】:

我正在尝试为我的应用程序中的外部调用声明一个通用包装器类型。

无论如何,有什么东西是一个类型内部的Promise,而不是显式使用Promise<T>

我对一种类型的最佳尝试:

type ExternalResult<T> = Promise<{
    success: boolean
    data?: T
    message?: string
}>

我希望如何使用它:

const getStuff = async (): ExternalResult<Stuff> => {
    const data = await myFetchWrapper( /* stuff */ )

    if ( data ) {
        return {
            success: true,
            data: data,
        }
    } else {
        return {
            success: false,
            message: 'Failed to get stuff',
        }
    }
}

我得到的错误:

TS1055:类型“ExternalResult”在 ES5/ES3 中不是有效的异步函数返回类型,因为它不引用与 Promise 兼容的构造函数值。

我知道我可以从我的 ExternalResult 类型中删除 Promise&lt;&gt; 并使用 Promise&lt;ExternalResult&lt; Stuff &gt;&gt;,但这不是我想要的。

谢谢。

【问题讨论】:

  • 我在 ts playground typescriptlang.org/play?#code/… 没有看到任何编译错误
  • 尝试将-target es2015 添加到您的tsc 调用中,或者将"target": "es2015" 添加到您的tsconfig.json

标签: typescript


【解决方案1】:

根据 MDN 文档 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function):

返回值。 一个 Promise,它将使用异步函数返回的值来解决,或者被异步函数抛出或未捕获的异常拒绝。

所以尝试用 Promise.resolve 调用来包装你的 return 语句:

if ( data ) {
    return Promise.resolve({
        success: true,
        data: data,
    });
} else {
    return Promise.resolve({
        success: false,
        message: 'Failed to get stuff',
    });
}

【讨论】:

    猜你喜欢
    • 2017-12-01
    • 2021-01-22
    • 2018-07-17
    • 2016-12-14
    • 2022-01-26
    • 2018-09-07
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    相关资源
    最近更新 更多