Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

fix(eslint-plugin): [promise-function-async] handle function overloading#10304

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 ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Conversation

@ronami
Copy link
Member

@ronamironami commentedNov 7, 2024
edited
Loading

PR Checklist

Overview

This PRresolves#5709 and takes function overloading into consideration.

Currently, the rule flags the following as an issue and auto-fixes it withasync, even though the actual return type of the function isPromise<number> | number:

functionb():Promise<number>functionb(a:boolean):numberfunctionb(a?:boolean):Promise<number>|number{returnPromise.resolve(1);}

This PR changes the rule to treat the above similarly to how it treats the following:

functionb(a?:boolean):Promise<number>|number{returnPromise.resolve(1);}

@typescript-eslint
Copy link
Contributor

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 onhttps://opencollective.com/typescript-eslint.

@netlify
Copy link

netlifybot commentedNov 7, 2024
edited
Loading

Deploy Preview fortypescript-eslint ready!

NameLink
🔨 Latest commit8f790ba
🔍 Latest deploy loghttps://app.netlify.com/sites/typescript-eslint/deploys/6747520cefbc0f0008ca94dc
😎 Deploy Previewhttps://deploy-preview-10304--typescript-eslint.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
Lighthouse
Lighthouse
1 paths audited
Performance: 94 (🔴 down 5 from production)
Accessibility: 100 (no change from production)
Best Practices: 92 (no change from production)
SEO: 98 (no change from production)
PWA: 80 (no change from production)
View the detailed breakdown and full score reports

To edit notification comments on pull requests, go to yourNetlify site configuration.

@nx-cloud
Copy link

nx-cloudbot commentedNov 7, 2024
edited
Loading

☁️ Nx Cloud Report

CI is running/has finished running commands for commit8f790ba. 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 targets

Sent with 💌 fromNxCloud.

Comment on lines 856 to 860
export function overloadingThatIncludeAny(): number;
export function overloadingThatIncludeAny(a: boolean): any;
export function overloadingThatIncludeAny(a?: boolean): any | number {
return Promise.resolve(5);
}
Copy link
MemberAuthor

@ronamironamiNov 7, 2024
edited
Loading

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 byno-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.

@ronamironami changed the titlefix(eslint-plugin): [@typescript-eslint/promise-function-async] handle function overloadingfix(eslint-plugin): [promise-function-async] handle function overloadingNov 7, 2024
@codecov
Copy link

codecovbot commentedNov 7, 2024
edited
Loading

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 86.76%. Comparing base(c13b6b4) to head(8f790ba).
Report is 53 commits behind head on main.

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
FlagCoverage Δ
unittest86.76% <100.00%> (+0.19%)⬆️

Flags with carried forward coverage won't be shown.Click here to find out more.

Files with missing linesCoverage Δ
.../eslint-plugin/src/rules/promise-function-async.ts100.00% <100.00%> (ø)

... and86 files with indirect coverage changes

@ronamironami marked this pull request as ready for reviewNovember 7, 2024 21:46
@ronami
Copy link
MemberAuthor

Codecov Report

Attention: Patch coverage is75.00000% with1 line in your changes missing coverage. Please review.

Project coverage is 86.55%. Comparing base(c13b6b4) to head(294711e).

Files with missing linesPatch %Lines
.../eslint-plugin/src/rules/promise-function-async.ts75.00%1 Missing⚠️
Additional details and impacted files

It seems like this line is not covered onno-unnecessary-type-parameters too, which usesgetSignatureFromDeclaration.

I'm not sure howgetSignatureFromDeclaration() can resolve toundefined in a function expression. I don't know if it's relevant, but TypeScript'schecker.ts defines the return type of the actual implementation as returningSignature.

@ronamironami marked this pull request as draftNovember 7, 2024 22:14
@ronamironami marked this pull request as ready for reviewNovember 7, 2024 22:25
@kirkwaiblinger
Copy link
Member

I'm not sure howgetSignatureFromDeclaration() can resolve toundefined in a function expression. I don't know if it's relevant, but TypeScript'schecker.ts defines the return type of the actual implementation as returningSignature.

The actualgetSignatureFromDeclaration() exposed to the API appears to be herehttps://github.com/microsoft/TypeScript/blob/55f1248a2052eebdea6bc0e2eef754df89a44bf7/src/compiler/checker.ts#L1776-L1779.

Looks like it's validating that the node passed in isFunctionLike, which eventually drills down tohere, which should always returntrue.

So the| undefined does appear to be unreachable for the nodes that we are passing in here... For situations like this we'd typically usenullThrows to satisfy coverage

ronami and JoshuaKGoldberg reacted with thumbs up emoji

@ronami
Copy link
MemberAuthor

I'm not sure howgetSignatureFromDeclaration() can resolve toundefined in a function expression. I don't know if it's relevant, but TypeScript'schecker.ts defines the return type of the actual implementation as returningSignature.

The actualgetSignatureFromDeclaration() exposed to the API appears to be herehttps://github.com/microsoft/TypeScript/blob/55f1248a2052eebdea6bc0e2eef754df89a44bf7/src/compiler/checker.ts#L1776-L1779.

Looks like it's validating that the node passed in isFunctionLike, which eventually drills down tohere, which should always returntrue.

So the| undefined does appear to be unreachable for the nodes that we are passing in here... For situations like this we'd typically usenullThrows to satisfy coverage

Thanks! I've updated the PR to match this 👍

@kirkwaiblinger
Copy link
Member

kirkwaiblinger commentedNov 11, 2024
edited
Loading

Currently, the rule flags the following as an issue and auto-fixes it withasync, even though the actual return type of the function isPromise<number> | number:

functionb():Promise<number>functionb(a:boolean):numberfunctionb(a?:boolean):Promise<number>|number{returnPromise.resolve(1);}

This PR changes the rule to treat the above similarly to how it treats the following:

functionb(a?:boolean):Promise<number>|number{returnPromise.resolve(1);}

I'm wondering if this should also be the case when theimplementation return type is not explicitly specified. I was playing around with this:

exportfunctiona():Promise<void>exportfunctiona(x:boolean):void// should not flag (right?), doesexportfunctiona(x?:boolean){if(x==null)returnPromise.reject(newError())thrownewError()}exportfunctionb():Promise<void>exportfunctionb(x:boolean):void// should not flag, doesn't (fixed in this PR)exportfunctionb(x?:boolean):Promise<void>|void{if(x==null)returnPromise.reject(newError())thrownewError()}// should not flag, doesn'texportfunctionc(x?:boolean):Promise<void>|void{if(x==null)returnPromise.reject(newError())thrownewError()}
ronami reacted with thumbs up emoji

@kirkwaiblingerkirkwaiblinger added the awaiting responseIssues waiting for a reply from the OP or another party labelNov 11, 2024
@ronami
Copy link
MemberAuthor

ronami commentedNov 16, 2024
edited
Loading

Currently, the rule flags the following as an issue and auto-fixes it withasync, even though the actual return type of the function isPromise<number> | number:

functionb():Promise<number>functionb(a:boolean):numberfunctionb(a?:boolean):Promise<number>|number{returnPromise.resolve(1);}

This PR changes the rule to treat the above similarly to how it treats the following:

functionb(a?:boolean):Promise<number>|number{returnPromise.resolve(1);}

I'm wondering if this should also be the case when theimplementation return type is not explicitly specified. I was playing around with this:

exportfunctiona():Promise<void>exportfunctiona(x:boolean):void// should not flag (right?), doesexportfunctiona(x?:boolean){if(x==null)returnPromise.reject(newError())thrownewError()}exportfunctionb():Promise<void>exportfunctionb(x:boolean):void// should not flag, doesn't (fixed in this PR)exportfunctionb(x?:boolean):Promise<void>|void{if(x==null)returnPromise.reject(newError())thrownewError()}// should not flag, doesn'texportfunctionc(x?:boolean):Promise<void>|void{if(x==null)returnPromise.reject(newError())thrownewError()}

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 theawaiting response label. I hope anyone sees this. 🙈

kirkwaiblinger reacted with thumbs up emoji

@kirkwaiblingerkirkwaiblinger added bugSomething isn't working and removed awaiting responseIssues waiting for a reply from the OP or another party labelsNov 18, 2024
Copy link
Member

@kirkwaiblingerkirkwaiblinger left a 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!

@kirkwaiblingerkirkwaiblinger added the awaiting responseIssues waiting for a reply from the OP or another party labelNov 27, 2024
@github-actionsgithub-actionsbot removed the awaiting responseIssues waiting for a reply from the OP or another party labelNov 27, 2024
Copy link
Member

@kirkwaiblingerkirkwaiblinger left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Great stuff! Thank you for sending in! ❤️

well done!

ronami reacted with heart emoji
@kirkwaiblingerkirkwaiblinger added the 1 approval>=1 team member has approved this PR; we're now leaving it open for more reviews before we merge labelNov 28, 2024
@JoshuaKGoldbergJoshuaKGoldberg merged commit68311ee intotypescript-eslint:mainDec 1, 2024
65 checks passed
@ronamironami deleted the promise-function-async-overloading branchDecember 1, 2024 21:00
renovatebot added a commit to mmkal/eslint-plugin-mmkal that referenced this pull requestDec 2, 2024
##### [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 AmielYou 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.
renovatebot added a commit to mmkal/eslint-plugin-mmkal that referenced this pull requestDec 2, 2024
##### [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 AmielYou 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.
renovatebot added a commit to andrei-picus-tink/auto-renovate that referenced this pull requestDec 3, 2024
| 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 AmielYou 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.
renovatebot added a commit to andrei-picus-tink/auto-renovate that referenced this pull requestDec 3, 2024
| 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 AmielYou 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.
@github-actionsgithub-actionsbot locked asresolvedand limited conversation to collaboratorsDec 13, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account?Sign in.

Reviewers

@kirkwaiblingerkirkwaiblingerkirkwaiblinger approved these changes

Assignees

No one assigned

Labels

1 approval>=1 team member has approved this PR; we're now leaving it open for more reviews before we mergebugSomething isn't working

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Bug:@typescript-eslint/promise-function-async function overloading

3 participants

@ronami@kirkwaiblinger@JoshuaKGoldberg

[8]ページ先頭

©2009-2025 Movatter.jp