Skip to content
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): [no-unnecessary-condition] improve checking optional callee #8178

Merged
merged 1 commit into from Jan 8, 2024

Conversation

yeonjuan
Copy link
Contributor

@yeonjuan yeonjuan commented Jan 3, 2024

PR Checklist

Overview

This pr improves unnecessary optional chaining checking of no-unnecessary-condition.
In below example, optional chain in y()?. is unnecessary because y does not return nullable value.
As described in #7912, the current no-unnecessary-condition does not check for the following case.

type T1 = { y: () => number } | null;
declare const x1: T1;
x1?.y()?.toExponential();

I added isCallExpressionNullableOriginFromCallee function.
This function takes a CallExpression node as an argument. It returns true if the call expression's nullable type is origin from callee otherwise returns false.

// isCallExpressionNullableOriginFromCallee will return true for given call expression `y()`
type T1 = { y: () => number } | null;
declare const x1: T1;
x1?.y()?.toExponential();
//    ^^^ y()'s nullable type is origin from T1's nullable type

// isCallExpressionNullableOriginFromCallee will return false for given call expression `y()`
type T1 = { y: () => number | null } | null;
declare const x1: T1;
x1?.y()?.toExponential();
//    ^^^ y()'s nullable type is origin from it's own definition. (() => number | null)

@typescript-eslint
Copy link
Contributor

Thanks for the PR, @yeonjuan!

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.

Copy link

netlify bot commented Jan 3, 2024

Deploy Preview for typescript-eslint ready!

Name Link
🔨 Latest commit d2acec3
🔍 Latest deploy log https://app.netlify.com/sites/typescript-eslint/deploys/65996385acf2ac00082030a5
😎 Deploy Preview https://deploy-preview-8178--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: 96 (🔴 down 3 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 your Netlify site configuration.

@yeonjuan yeonjuan force-pushed the fix/7912 branch 2 times, most recently from f11873b to 3dd8119 Compare January 6, 2024 14:28
@yeonjuan yeonjuan changed the title fix(eslint-plugin): [no-unnecessary-condition] handle nullable callee fix(eslint-plugin): [no-unnecessary-condition] improve checking optional callee Jan 6, 2024
Copy link
Member

@JoshuaKGoldberg JoshuaKGoldberg left a comment

Choose a reason for hiding this comment

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

Tricky 😄 but this look great. Thanks for working on it!

Posh older British lady saying 'excellent!' enthusiastically and clenching a fist

@JoshuaKGoldberg JoshuaKGoldberg merged commit 10c0530 into typescript-eslint:main Jan 8, 2024
55 of 58 checks passed
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Jan 16, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Bug: [no-unnecessary-condition] Improper checking of optional chaining of defined method return value
2 participants