Enhancement: [prefer-promise-reject-errors] option to allow 'rethrow' of signal reasons or caught values #11095
Labels
enhancement: plugin rule option
New rule option for an existing eslint-plugin rule
package: eslint-plugin
Issues related to @typescript-eslint/eslint-plugin
triage
Waiting for team members to take a look
Before You File a Proposal Please Confirm You Have Done The Following...
My proposal is suitable for this project
Link to the rule's documentation
https://typescript-eslint.io/rules/prefer-promise-reject-errors/
Description
When performing more complex async operations, a developer may call the
reject
executor of aPromise
to propagate anAbortSignal
reason, a value obtained by acatch
block, or the reason parameter of a.then(_, onrejected)
or.catch()
callback.in this case, it's often desirable to reject with the exact reason, to accurately propagate failures without changing them.
but,
prefer-promise-reject-errors
may complain unless these values are consistently verified.it makes sense that some users of this rule may want the rule to enforce checking, assertion, or wrapping of reasons here, but i think it's common and good practice in many cases to simply propagate reasons without modifying them.
the rule is also applied inconsistently, and a few examples are provided.
Fail
Pass
Additional Info
the signal example is surprisingly common - an event listener is the most certain and reliable way to immediately react to signal activation.
the promise catch/rethrow is even more contrived, and debatable, but it makes sense to me that it should be possible to propagate a 'caught' value with no intervention.
inconsistent application: things that are presently permitted, but seem to violate the rule
rethrow behavior may be achieved a couple other ways, which the rule doesn't complain about, but i think that's a problem (the rule is inconsistent) rather than an acceptable workaround.
for example, this is permitted without complaint, but it appears to mostly be a failure to understand the
reject
ofPromise.withResolvers
as a promise executor.this triggers no complaints. it's kind of strange and i would also consider failure to detect this a lower priority, like the handler assignment. notably, this technique was the only way to obtain promise executor callbacks outside of the promise executor scope, before
Promise.withResolvers
became available.this next example is incorrect for a few reasons (the signal itself becomes the propagated value, this may clobber existing handlers), this is permitted without complaint. this appears mostly to be a failure to understand that assigning
reject
to an event handler attribute will result in a call toreject
.The text was updated successfully, but these errors were encountered: