-
-
Notifications
You must be signed in to change notification settings - Fork 2.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix(eslint-plugin): [promise-function-async] handle function overloading #10304
fix(eslint-plugin): [promise-function-async] handle function overloading #10304
Conversation
Thanks for the PR, @ronami! typescript-eslint is a 100% community driven project, and we are incredibly grateful that you are contributing to that community. The core maintainers work on this in their personal time, so please understand that it may not be possible for them to review your work immediately. Thanks again! 🙏 Please, if you or your company is finding typescript-eslint valuable, help us sustain the project by sponsoring it transparently on https://opencollective.com/typescript-eslint. |
✅ Deploy Preview for typescript-eslint ready!
To edit notification comments on pull requests, go to your Netlify site configuration. |
☁️ Nx Cloud ReportCI is running/has finished running commands for commit 8f790ba. As they complete they will appear below. Click to see the status, the terminal output, and the build insights. 📂 See all runs for this CI Pipeline Execution ✅ Successfully ran 2 targetsSent with 💌 from NxCloud. |
export function overloadingThatIncludeAny(): number; | ||
export function overloadingThatIncludeAny(a: boolean): any; | ||
export function overloadingThatIncludeAny(a?: boolean): any | number { | ||
return Promise.resolve(5); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This and the test below aren't exactly valid TypeScript code (will also be flagged by no-redundant-type-constituents
), but it did fail while I was figuring out the edge cases on my first pass at it (I've iterated the possible function signatures and their return types). Please let me know if I should drop these.
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## main #10304 +/- ##
==========================================
+ Coverage 86.56% 86.76% +0.19%
==========================================
Files 431 443 +12
Lines 15188 15305 +117
Branches 4418 4455 +37
==========================================
+ Hits 13148 13279 +131
+ Misses 1683 1672 -11
+ Partials 357 354 -3
Flags with carried forward coverage won't be shown. Click here to find out more.
|
It seems like this line is not covered on I'm not sure how |
The actual Looks like it's validating that the node passed in is So the |
Thanks! I've updated the PR to match this 👍 |
I'm wondering if this should also be the case when the implementation return type is not explicitly specified. I was playing around with this: export function a(): Promise<void>
export function a(x: boolean): void
// should not flag (right?), does
export function a(x?: boolean) {
if (x == null) return Promise.reject(new Error())
throw new Error()
}
export function b(): Promise<void>
export function b(x: boolean): void
// should not flag, doesn't (fixed in this PR)
export function b(x?: boolean): Promise<void> | void {
if (x == null) return Promise.reject(new Error())
throw new Error()
}
// should not flag, doesn't
export function c(x?: boolean): Promise<void> | void {
if (x == null) return Promise.reject(new Error())
throw new Error()
} |
Interesting, I didn't take this into consideration. I was hoping I can get away with not having to checking every call signature. I made some changes to the PR to address this, thanks 👍 Edit: There's no review so I can't ask for a re-review or remove the |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks great to me! Just touchups requested. Thanks!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
##### [v8.17.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8170-2024-12-02) ##### 🚀 Features - **eslint-plugin:** \[prefer-promise-reject-errors] options to allow any and unknown ([#10392](typescript-eslint/typescript-eslint#10392)) ##### 🩹 Fixes - **eslint-plugin:** \[promise-function-async] handle function overloading ([#10304](typescript-eslint/typescript-eslint#10304)) - **eslint-plugin:** remove references to "extendDefaults" in no-restricted-types ([#10401](typescript-eslint/typescript-eslint#10401)) - **eslint-plugin:** \[no-unnecessary-template-expressions] allow template expressions used to make trailing whitespace visible ([#10363](typescript-eslint/typescript-eslint#10363)) ##### ❤️ Thank You - Kim OhSeong [@bkks1004](https://github.com/bkks1004) - Kirk Waiblinger [@kirkwaiblinger](https://github.com/kirkwaiblinger) - Maria José Solano [@MariaSolOs](https://github.com/MariaSolOs) - Ronen Amiel You can read about our [versioning strategy](https://main--typescript-eslint.netlify.app/users/versioning) and [releases](https://main--typescript-eslint.netlify.app/users/releases) on our website.
##### [v8.17.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8170-2024-12-02) ##### 🚀 Features - **eslint-plugin:** \[prefer-promise-reject-errors] options to allow any and unknown ([#10392](typescript-eslint/typescript-eslint#10392)) ##### 🩹 Fixes - **eslint-plugin:** \[promise-function-async] handle function overloading ([#10304](typescript-eslint/typescript-eslint#10304)) - **eslint-plugin:** remove references to "extendDefaults" in no-restricted-types ([#10401](typescript-eslint/typescript-eslint#10401)) - **eslint-plugin:** \[no-unnecessary-template-expressions] allow template expressions used to make trailing whitespace visible ([#10363](typescript-eslint/typescript-eslint#10363)) ##### ❤️ Thank You - Kim OhSeong [@bkks1004](https://github.com/bkks1004) - Kirk Waiblinger [@kirkwaiblinger](https://github.com/kirkwaiblinger) - Maria José Solano [@MariaSolOs](https://github.com/MariaSolOs) - Ronen Amiel You can read about our [versioning strategy](https://main--typescript-eslint.netlify.app/users/versioning) and [releases](https://main--typescript-eslint.netlify.app/users/releases) on our website.
| datasource | package | from | to | | ---------- | -------------------------------- | ------ | ------ | | npm | @typescript-eslint/eslint-plugin | 8.16.0 | 8.17.0 | | npm | @typescript-eslint/parser | 8.16.0 | 8.17.0 | ## [v8.17.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8170-2024-12-02) ##### 🚀 Features - **eslint-plugin:** \[prefer-promise-reject-errors] options to allow any and unknown ([#10392](typescript-eslint/typescript-eslint#10392)) ##### 🩹 Fixes - **eslint-plugin:** \[promise-function-async] handle function overloading ([#10304](typescript-eslint/typescript-eslint#10304)) - **eslint-plugin:** remove references to "extendDefaults" in no-restricted-types ([#10401](typescript-eslint/typescript-eslint#10401)) - **eslint-plugin:** \[no-unnecessary-template-expressions] allow template expressions used to make trailing whitespace visible ([#10363](typescript-eslint/typescript-eslint#10363)) ##### ❤️ Thank You - Kim OhSeong [@bkks1004](https://github.com/bkks1004) - Kirk Waiblinger [@kirkwaiblinger](https://github.com/kirkwaiblinger) - Maria José Solano [@MariaSolOs](https://github.com/MariaSolOs) - Ronen Amiel You can read about our [versioning strategy](https://main--typescript-eslint.netlify.app/users/versioning) and [releases](https://main--typescript-eslint.netlify.app/users/releases) on our website.
| datasource | package | from | to | | ---------- | -------------------------------- | ------ | ------ | | npm | @typescript-eslint/eslint-plugin | 8.16.0 | 8.17.0 | | npm | @typescript-eslint/parser | 8.16.0 | 8.17.0 | ## [v8.17.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8170-2024-12-02) ##### 🚀 Features - **eslint-plugin:** \[prefer-promise-reject-errors] options to allow any and unknown ([#10392](typescript-eslint/typescript-eslint#10392)) ##### 🩹 Fixes - **eslint-plugin:** \[promise-function-async] handle function overloading ([#10304](typescript-eslint/typescript-eslint#10304)) - **eslint-plugin:** remove references to "extendDefaults" in no-restricted-types ([#10401](typescript-eslint/typescript-eslint#10401)) - **eslint-plugin:** \[no-unnecessary-template-expressions] allow template expressions used to make trailing whitespace visible ([#10363](typescript-eslint/typescript-eslint#10363)) ##### ❤️ Thank You - Kim OhSeong [@bkks1004](https://github.com/bkks1004) - Kirk Waiblinger [@kirkwaiblinger](https://github.com/kirkwaiblinger) - Maria José Solano [@MariaSolOs](https://github.com/MariaSolOs) - Ronen Amiel You can read about our [versioning strategy](https://main--typescript-eslint.netlify.app/users/versioning) and [releases](https://main--typescript-eslint.netlify.app/users/releases) on our website.
PR Checklist
@typescript-eslint/promise-function-async
function overloading #5709Overview
This PR resolves #5709 and takes function overloading into consideration.
Currently, the rule flags the following as an issue and auto-fixes it with
async
, even though the actual return type of the function isPromise<number> | number
:This PR changes the rule to treat the above similarly to how it treats the following: