From 630b84ccdf59deb2c8fbb83c49ba167f6d05f5cc Mon Sep 17 00:00:00 2001 From: Tomoaki Hirabayashi Date: Mon, 22 Sep 2025 18:00:20 +0900 Subject: [PATCH] [Fix] `no-unused-prop-types`: detect used props in nested components --- lib/util/usedPropTypes.js | 15 ++++++++++- tests/lib/rules/no-unused-prop-types.js | 36 +++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/lib/util/usedPropTypes.js b/lib/util/usedPropTypes.js index f0dae34ca4..f823cd75b9 100644 --- a/lib/util/usedPropTypes.js +++ b/lib/util/usedPropTypes.js @@ -407,7 +407,20 @@ module.exports = function usedPropTypesInstructions(context, components, utils) } } - components.set(component ? component.node : node, { + let targetNode = component ? component.node : node; + + if (component && !component.declaredPropTypes) { + let parentComponent = components.get(node.parent); + while (parentComponent) { + if (parentComponent.declaredPropTypes) { + targetNode = parentComponent.node; + break; + } + parentComponent = components.get(parentComponent.parent); + } + } + + components.set(targetNode, { usedPropTypes, ignoreUnusedPropTypesValidation, }); diff --git a/tests/lib/rules/no-unused-prop-types.js b/tests/lib/rules/no-unused-prop-types.js index 943db3048e..c1edee773c 100644 --- a/tests/lib/rules/no-unused-prop-types.js +++ b/tests/lib/rules/no-unused-prop-types.js @@ -3948,6 +3948,22 @@ ruleTester.run('no-unused-prop-types', rule, { `, features: ['types'], }, + { + code: ` + type Props = { + used: string; + }; + + const Demo = React.memo( + React.forwardRef( + ({ used }, ref) => { + return
{used}
+ } + ) + ); + `, + features: ['types'], + }, ]), invalid: parsers.all([].concat( @@ -6709,6 +6725,26 @@ ruleTester.run('no-unused-prop-types', rule, { errors: [ { message: '\'bar\' PropType is defined but prop is never used' }, ], + }, + { + code: ` + type Props = { + used: string; + unused: string; + }; + + const Demo = React.memo( + React.forwardRef( + ({ used }, ref) => { + return
{used}
+ } + ) + ); + `, + features: ['ts', 'no-babel'], + errors: [ + { message: '\'unused\' PropType is defined but prop is never used' }, + ], } )), });