Skip to content

Fix false positive for self-referential useCallback#36337

Open
KimHyeongRae0 wants to merge 1 commit intofacebook:mainfrom
KimHyeongRae0:fix/35576-usecallback-self-reference
Open

Fix false positive for self-referential useCallback#36337
KimHyeongRae0 wants to merge 1 commit intofacebook:mainfrom
KimHyeongRae0:fix/35576-usecallback-self-reference

Conversation

@KimHyeongRae0
Copy link
Copy Markdown

@KimHyeongRae0 KimHyeongRae0 commented Apr 24, 2026

Fixes #35576.

The immutability rule currently reports a TDZ-style error for a stable self-reference inside useCallback, such as removing the same callback from an event listener.

This updates hoisted context tracking to only record real reads that happen before initialization. Self-references introduced by the callback being memoized are ignored, while later captures that actually read a declaration before initialization still fail.

Tests:

  • add a regression that allows a self-referential useCallback
  • keep a regression that still rejects a later declaration capture
  • run yarn workspace eslint-plugin-react-hooks test --runInBand

@meta-cla meta-cla Bot added the CLA Signed label Apr 24, 2026
Copy link
Copy Markdown

@liufang88789-ui liufang88789-ui left a comment

Choose a reason for hiding this comment

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

This is a tricky one to get right. The distinction between a stable self-reference (callback capturing itself through memoization) and a genuine TDZ violation is subtle, and the old code couldn't tell them apart.

The approach works well - by tracking which captures are introduced by the memoization itself versus which are genuine out-of-order reads, you avoid the false positive while keeping the real TDZ check intact.

The two regression tests are the right cases: removing itself is exactly the stable self-reference pattern that should be allowed, and reading before is declared is a legitimate error that should still be caught. Good coverage.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: The ESLint react-hooks/immutability rule warns against using a callback internally

2 participants