Description
Before You File a Proposal Please Confirm You Have Done The Following...
- I have searched for related issues and found none that match my proposal.
- I have searched the current rule list and found no rules that match my proposal.
- I have read the FAQ and my problem is not listed.
My proposal is suitable for this project
- I believe my proposal would be useful to the broader TypeScript community (meaning it is not a niche proposal).
Link to the rule's documentation
https://typescript-eslint.io/rules/only-throw-error
Description
only-throw-error
(and prefer-promise-reject-errors
) disallow throwing non-error values. only-throw-error
(and with #10375 prefer-promise-reject-errors
too) can be configured to allow throwing unknown
and any
types in addition to error values.
It's necessary to enable allowThrowingUnknown
so re-throwing a cached error is valid (or any
in some tsconfig.json
configurations):
function test() {
try {
// ...
} catch (error) {
if (x) {
throw new Error()
}
// this would otherwise fail
throw error;
}
}
While configuring allowThrowingUnknown
makes the above pass, it allows potentially unsafe throwing of an unknown
type:
function foo(): unknown {
// not necessarily returns an `Error` object
}
function test() {
// this should fail
throw foo();
}
This issue proposes an additional option, a stricter form of allowThrowingUnknown,
which will allow re-throwing a caught error.
This is relevant both to only-throw-error
and prefer-promise-reject-errors
.
Fail
function foo(): unknown {
// not necessarily returns an `Error` object
}
function test() {
// this should fail
throw foo();
}
Pass
function test() {
try {
// ...
} catch (error) {
if (x) {
throw new Error()
}
throw error;
}
}
Additional Info
No response