-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
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
False positive for react/jsx-no-leaked-render #3292
Comments
cc @Belco90 |
@ljharb thanks for pinging! I can take care of this, feel free to assign it to me. |
@Robloche regarding the false positive reported: I think sometimes you would be interested into having this rule applied to props also, like: <MyReactComponent
header={someNumber && <Header />}
isDisabled={foo && bar === 0}
/> So I think the proper fix for this would be to make sure the right side of the && operator is not a condition. |
Agreed. So what's you recommendation? As for now, I simply rewrote my code, adding a local |
The right side should be able to be any value that’s safe to render, which includes booleans. |
That's true, but now I don't know what to do with this false positive since I can't figure the types of the operators. Any suggestions? |
The RHS is an === comparison; it can’t ever be anything but a boolean. You don’t need to know any types to figure that part out. |
Exactly, so since the RHS is something renderable, this rule should complain about it since we don't know the type for the LHS (it could be a zero, so the rule reported it as expected). I was suggesting to report props only when there is a && operator and the RHS is a component so we can assume you want to pass that prop to render something, rather than just use the value for logic purposes. |
Yes, I'm aligned with your suggestion. That should do the trick. |
This could be even fixed by introducing a new option:
|
@Belco90 in this example tho, |
Is it? If so, it's ok for that case. What about the cases described before? |
In the case of #3292 (comment), with no type information, obviously both of those should warn. |
I'm also getting a very incorrect error for this: const DISPLAY = {
WELCOME: 'WELCOME',
FOO: 'FOO'
};
const Component = () => {
const [display, setDisplay] = useState(DISPLAY.WELCOME);
const test = !display || display === DISPLAY.WELCOME;
console.log(typeof(test)); // logs 'boolean'
return (
<div>
{(!display || display === DISPLAY.WELCOME) && (
<span>my condition produces a linting error even though it is correctly interpreted as a boolean</span>
)}
</div>
);
}; |
In that case, since |
@ljharb I'll need way more time to try checking the TS types when available for the operators of the logical expression as discussed in this issue, since I've never done this before. |
…d ternary branches deletion Closes jsx-eslint#3297. Relates to jsx-eslint#3292.
Not sure it can help but I have been using this relatively simple rule so far https://github.com/grailed-code/eslint-plugin-grailed/blob/main/lib/rules/jsx-no-ampersands.js |
We don’t want to forbid && entirely tho - many uses of it are perfectly fine. |
A new option would be good. Props should not be validated by default. Also the fix should not result to |
Returning |
re: |
@pke I see, I guess we can discuss on how to improve the rule reporting on props other than |
You see the problem with null in that case though? |
Yes, but a present undefined prop isn't the same thing as an absent prop either. In this specific case, if the prop value is |
Like for the JSX compiler? Would you mind to explain? |
Like for the props object the component receives. |
Has typescript awareness landed for this rule? |
@shamilovtim I'm afraid it didn't, and I'm not really available to handle this for now. |
That's a bummer :/ I imagine it would be quite a bit easier to determine if the variable is a boolean in a Typescript aware context. |
This rules is sadly completely broken (at least in TS ?). I'm using it with checked={selectedCount > 0 && selectedCount === items.length} and wants to change it to checked={selectedCount > 0 ? selectedCount === items.length : null} which doesn't make sense at all. Another example: // source
contentEditable={!disabled && editable}
// fixed
contentEditable={!disabled ? editable : null} For me personally it would be enough if the rule would not apply to props. I acknowledge that there are valid cases where this rule should apply to props as well but IMO without looking at TS types this can result in a lot of false positives like my example above. The rule should target props that accept JSX only. Actually I was quite surprised that the rule was also applied to props as I didn't expect this from looking at the examples in the documentation. My suggestion would be to either remove this rule from props until it got a bit smarter or at least make it configurable if it should be applied to props or not. Please let me know which of these 2 options would be preferred as a short-term solution and I'm happy to contribute that change. But for me, in its current state, this rule is unusable. |
@levrik IMO we should include an option in the rule to avoid reporting props other than |
@levrik have you tried the latest version? |
@ljharb I tested with version 7.31.8 |
I've fixed this in #3441 (new Can one of you write the docs for that PR? Just type them in this issue, and I'll copy them into my PR. Thanks! Of course, the best solution would involve TypeScript type-checking. Does this plugin allow that, or maybe someone can provide guidance here? |
Oh I just found this plugin, which uses TypeScript: |
Oh nice, looks like a nice plugin! @hluisson since you're the author of this, would you be interested in contributing TypeScript type checking also to |
This rule is unusable to me until PR #3441 is landed. I need to handle a very basic usecase of |
Yeah we can't use this rule either. It's not inferring bools. One of these days I'll be on a project where I can afford to contribute back here. Thank you to the maintainers and contributors. |
Unfortunately the plugin does not work with |
We're on the latest version by overriding the package version installed, eg using npm Overrides:
{
"overrides": {
"@typescript-eslint/eslint-plugin": "6.9.1",
"@typescript-eslint/parser": "6.9.1"
}
} (or Yarn Resolutions or pnpm Overrides) |
Using overrides will cause a number of rules to be broken; peer dep warnings need to be respected. |
Yeah, good warning for many cases. I was talking about a workaround for this specific case, where it does not cause breakage in our experience. |
If that were true, we wouldn’t need #3629 ¯\_(ツ)_/¯ |
makes no sense that this checked props in the first place |
Has this problem been resolved? |
Following code triggers
react/jsx-no-leaked-render
although it's perfectly valid:with:
The text was updated successfully, but these errors were encountered: