打字稿承诺泛型类型

VJA*_*JAI 29 generics typescript

我有一个示例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");
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

小智 68

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

例如:

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

  • 有没有办法指定错误情况的类型?例如,我有一个承诺,如果拒绝,则使用自定义对象拒绝。我可以使用“Promise&lt;T&gt;”内置泛型类型指定拒绝值的类型吗?谢谢你! (5认同)
  • @GeorgePantazes:我不相信如果可以*可选地*指定拒绝类型会很乏味。此外,人们也无法控制解析值内部运行的内容,但仍然可以指定它。 (3认同)
  • @tonix您拒绝自定义对象的确切原因(这样做的灵活性)是因为“Promise”具有“any”错误类型。错误类型不能受到限制,因为 Promise 中的任何运行代码都可以抛出任何内容,而不仅仅是正常的“Error”。(请参阅 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/throw 。它是“抛出表达式”)。由于 Promise 是一个通用对象,无法控制其中运行的内容,并且期望您(开发人员)控制其中运行的内容也将是乏味/过度期望的,因此错误类型无法受到限制。 (2认同)

小智 6

您可以定义一个自定义的 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`
Run Code Online (Sandbox Code Playgroud)