From 71a0e8f43edc03049b14ddabf38e6faa59c79d7f Mon Sep 17 00:00:00 2001 From: Pascal Corpet Date: Fri, 2 Oct 2020 00:09:43 +0200 Subject: [PATCH] [Fix] `no-unused-prop-types`: Silence false positive on `never` type in TS --- CHANGELOG.md | 7 ++++++- lib/rules/no-unused-prop-types.js | 5 +++++ tests/lib/rules/no-unused-prop-types.js | 13 +++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81ba107b78..f3d60c65c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,14 @@ This change log adheres to standards from [Keep a CHANGELOG](http://keepachangel ## Unreleased +### Fixed +* [`no-unused-prop-types`]: Silence false positive on `never` type in TS ([#2815][] @pcorpet) + +[#2815]: https://github.com/yannickcr/eslint-plugin-react/pull/2815 + ## [7.21.3] - 2020.10.02 -## Fixed +### Fixed * [`prop-types`]: fix Cannot read property 'type' of undefined error when destructured param ([#2807][] @minwe) * [`no-typos`]: avoid crash on spread syntax in createReactClass object ([#2816][] @ljharb @Songyu-Wang) diff --git a/lib/rules/no-unused-prop-types.js b/lib/rules/no-unused-prop-types.js index f6a95aca0a..fe3f113d98 100644 --- a/lib/rules/no-unused-prop-types.js +++ b/lib/rules/no-unused-prop-types.js @@ -102,6 +102,11 @@ module.exports = { return; } + if (prop.node && prop.node.typeAnnotation && prop.node.typeAnnotation.typeAnnotation + && prop.node.typeAnnotation.typeAnnotation.type === 'TSNeverKeyword') { + return; + } + if (prop.node && !isPropUsed(component, prop)) { context.report({ node: prop.node.key || prop.node, diff --git a/tests/lib/rules/no-unused-prop-types.js b/tests/lib/rules/no-unused-prop-types.js index 7ae9947f20..998d026f06 100644 --- a/tests/lib/rules/no-unused-prop-types.js +++ b/tests/lib/rules/no-unused-prop-types.js @@ -3668,6 +3668,19 @@ ruleTester.run('no-unused-prop-types', rule, { `, parser: parsers['@TYPESCRIPT_ESLINT'] }, + { + code: ` + interface Person { + firstname: string + lastname?: never + }; + + const Hello = ({firstname}: Person) => { + return
{firstname}
; + }; + `, + parser: parsers['@TYPESCRIPT_ESLINT'] + }, { code: ` class App extends Component {