TypeScript: Promise rejection type.
Search Terms
Promise Reject Type
Suggestion
Add ability to type Promise rejections.
// Current Promise Constructor Implementation:
new <T>(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): Promise<T>;
// Proposed Change:
new <T, E = any>(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: E) => void) => void): Promise<T, E>;
Use Cases
When handling promise rejections, the type any isn’t very useful. I would be useful to have the rejection have an actual type without the need to cast or type guard.
Examples
Promise.reject<never, string>('hello world')
.catch(reason => {
console.error(reason.length); // `reason` is of type string.
});
class MyError extends Error {
// ...
}
Promise.reject<never, MyError>(new MyError(/* ... */))
.catch(reason => {
// `reason` is of type MyError.
const info = reason.getMoreInfo();
// ...
});
Checklist
My suggestion meets these guidelines:
- This wouldn’t be a breaking change in existing TypeScript/JavaScript code
- This wouldn’t change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn’t a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, etc.)
- This feature would agree with the rest of TypeScript’s Design Goals.
About this issue
- Original URL
- State: open
- Created 4 years ago
- Reactions: 32
- Comments: 17 (4 by maintainers)
Commits related to this issue
- Fixing TS definitions Promise rejection errors as jsdoc, because it is not supported in TS yet (https://github.com/microsoft/TypeScript/issues/39680). Use Generics to type resolved value and message ... — committed to remss/ws-await by deleted user 3 years ago
- Fixing TS definitions Promise rejection errors as jsdoc, because it is not supported in TS yet (https://github.com/microsoft/TypeScript/issues/39680). Use Generics to type resolved value and message ... — committed to remss/ws-await by remss 3 years ago
Just encountered working with
reasonas ananytype. I understand why it doesn’t have a specific type, but I guess I’m wondering why it’s not instead typed asunknown? There’s a similar situation for theerrorproperty ofErrorEventas it’s completely non-standard.In both situations, it seems that the appropriate type should be
unknown, which by definition forces the developer into safe type guards. Having it typed asanyjust takes TS out of the picture altogether.