-
-
Notifications
You must be signed in to change notification settings - Fork 2.9k
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/await-thenable/, https://typescript-eslint.io/rules/no-floating-promises, https://typescript-eslint.io/rules/no-misused-promises
Description
I would like to find a place to lint for providing a sync disposable to an await using statement. This relates closely to #8858, so maybe await-thenable is the right place for this check? But it also has concerns very adjacent to no-floating-promises and no-misused-promises, so I'm not sure.
Fail
async function unhandledRejection() {
await using _ = {
async [Symbol.dispose]() {
throw new Error('dispose error');
}
}
}Pass
async function properlyHandledRejection() {
await using _ = {
async [Symbol.asyncDispose]() {
throw new Error('dispose error');
}
}
}Additional Info
The promise rejection in unhandledRejection cannot be caught, since the [Symbol.dispose]() method is called, but is not awaited, by an await using statement. Only the [Symbol.asyncDispose]() method is awaited.
There's a lot of subtlety here so I've provided a repo to be able to play with variations on this at https://github.com/kirkwaiblinger/typescript-eslint-repro-await-using