承诺通用类型

我有一个例子,承诺函数如下。成功时返回 number,失败时返回 string。编译器抱怨要为承诺指定某种泛型类型。在这种情况下,我必须指定什么类型?我必须像 Promise<number>Promise<number | string>那样指定吗?

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

项目的一般类型应该对应于函数的非错误返回类型。该错误是 any类型的隐式错误,并且未在承诺泛型类型中指定。

例如:

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

另一个解决办法

顺便说一句

泛型类型“承诺”需要1个类型参数. ts (2314)

function test(arg: string){
return new Promise<number>((resolve, reject) => {
if (arg === "a") {
resolve(1);
// (parameter) resolve: (value: number | PromiseLike<number>) => void
} else {
// (parameter) reject: (reason?: any) => void
reject("1");
}
});
}


enter image description here

您可以定义一个自定义的噪声类型,它实际上也关心拒绝的类型。你也可以只给它一个单一的类型和拒绝类型将是 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`