打字稿承诺泛型类型

新手上路,请多包涵

我有一个示例 Promise 函数,如下所示。成功时,我返回 number ,错误时返回 string 。编译器抱怨为 Promise 指定某种泛型类型。在这种情况下,我必须指定什么类型?我是否必须指定像 Promise<number>Promise<number | string>

 function test(arg: string): Promise {
    return new Promise((resolve, reject) => {
        if (arg === "a") {
            resolve(1);
        } else {
            reject("1");
        }
    });
}

原文由 VJAI 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 790
2 个回答

Promise 的泛型类型应该对应于函数的非错误返回类型。该错误隐式属于 any 类型,并且未在 Promise 泛型类型中指定。

例如:

 function test(arg: string): Promise<number> {
    return new Promise<number>((resolve, reject) => {
        if (arg === "a") {
            resolve(1);
        } else {
            reject("1");
        }
    });
}

原文由 Dave Templin 发布,翻译遵循 CC BY-SA 3.0 许可协议

你可以定义一个自定义的 Promise 类型,它实际上也关心拒绝的类型。您也可以只给它一个类型,拒绝类型将是 any ,就像在正常的承诺中一样。


type CustomPromise<T, F = any> = {
    catch<TResult = never>(
        onrejected?: ((reason: F) => TResult | PromiseLike<TResult>) | undefined | null
    ): Promise<T | TResult>;
} & Promise<T>;

function test(arg: string): CustomPromise<number, string> {
    return new Promise((resolve, reject) => {
        if (arg === "a") {
            resolve(1);
        } else {
            reject("1");
        }
    });
}

const myPromise = test("a");
myPromise.then((value) => {}); //value is of type `number`
myPromise.catch((reason) => {}); //reason is of type `string`

原文由 Nibuja 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进