Reputation: 32758
I've a sample Promise function like below. On success I return a number
and on false I return string
. The compiler is complaining to specify some kind of generic type to the promise. In this case what type I've to specify? Do I've to specify like Promise<number>
or Promise<number | string>
?
function test(arg: string): Promise {
return new Promise((resolve, reject) => {
if (arg === "a") {
resolve(1);
} else {
reject("1");
}
});
}
Upvotes: 79
Views: 174270
Reputation: 71
You could define a custom Promise type that actually also cares about the type of the rejection. You can also just give it a single type and the reject type will be any
, like in a normal promise.
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`
Upvotes: 7
Reputation: 85
function test(arg: string) {
return new Promise((resolve: (value: number) => void, reject) => {
if (arg === "a") {
resolve(1);
} else {
reject("1");
}
});
}
Upvotes: -1
Reputation: 1824
The generic type of the Promise should correspond to the non-error return-type of the function. The error is implicitly of type any
and is not specified in the Promise generic type.
So for example:
function test(arg: string): Promise<number> {
return new Promise<number>((resolve, reject) => {
if (arg === "a") {
resolve(1);
} else {
reject("1");
}
});
}
Upvotes: 161