35

What I have

import { NextPage } from 'next';
import React from 'react';

interface Props {
  name: string;
  gretting?: string; // Error: ESLint: propType "gretting" is not required, but has no corresponding defaultProps declaration.(react/require-default-props) 
}

const Hello: React.FunctionComponent<Props> = ({ name, gretting = 'night' }: Props) =>
  <p>Hi {name} Good {gretting}</p>;

const Home: NextPage = () => <Hello name="Jhon Doe" />;

export default Home;

Problem

Eslint react plugin complain with this error ESLint: propType "gretting" is not required, but has no corresponding defaultProps declaration.(react/require-default-props).

According with this answer the approach used to defaultProps with default parameters values its fine so what is the best way to solve this issue? Use Hello.defaultProps = {} or turn off the rule react/require-default-props? there is a better approach?.

2
  • Props are declared as nombre, saludo, but deconstructed as name, gretting.Is that code really what you have? Because that's not going to work. Commented Sep 1, 2020 at 23:51
  • @AlexWayne I'm sorry it was my fault, I corrected it Commented Sep 2, 2020 at 0:08

3 Answers 3

36

I found another solution for functional components - you can just use React.FC, which provides type checking and autocomplete for static properties like defaultProps.

const Hello: React.FC<{name: string, gretting: string}> = ({ name, gretting = 'night' }) =>

In that case you don't have to use interface at all. But in case you want for some reason:

const Hello: React.FC<IProps> = ({ name, gretting = 'night' }) =>

===== UPDATE=====

Additionally:

"react/prop-types": "off" // Since we do not use prop-types

"react/require-default-props": "off" // Since we do not use prop-types

Sign up to request clarification or add additional context in comments.

4 Comments

I cant to reproduce this, in my case eslint continue showing the same error in the interface... i need more context, do u use in some place Hello.defaultProps = {} or sometihng aditional that u dont post in the answer?
No, I didn't use defaultProps, I już switched FunctionalComponent with FC and I removed interface type from parentheses. I also used very strict eslint config with full airbnb. I found this solution here: pluralsight.com/guides/…
I added update. This eslint rule has no sense for React + TS combinantion.
Any comments on React.FC discouraged? github.com/facebook/create-react-app/pull/8177
14

I've had this problem and fixed it by exporting the type or interface, though I can't explain why that was the solution to the issue.

export interface Props {
  name: string;
  greeting?: string;
}

const Hello = ({name, greeting = 'Hi'}: Props): JSX.Element = {}

edit: found you need Typescript 3.0 as per this answer: https://stackoverflow.com/a/51486735/5059401

1 Comment

I think it solved the problem because you are explicitly setting a default value with greeting = 'Hi'
3

defaultProp is used when the passed prop is null or undefined

interface Props {
  name: string;
  gretting?: string;// question mark means it could be undefined
}

in this inter face you declared name as string, which mean it won't be null or undefined, so you can skip defaultProp for it
but gretting is declared as string or undefined, so there is a change it will be undefined, so a defaultProp for it is necessary

Hello.defaultProps = {
  gretting: '',
};

edit: found you need Typescript 3.0 as per this answer: https://stackoverflow.com/a/51486735/5059401

4 Comments

Whenever I use ?: in props should to declare their default values explicitly with defaultProps = {}?, Other thing, the default value of the property is not passed in gretting = 'night'?
yes, react/require-default-props does not consider your param defaults, it only checks defaultProps, in this case you could simply disable it
I am not clear, should I disable the rule globally or just for this occasion? because disabling the rule whenever I need to use an optional prop(?:) is very inefficient... or better I should always set myCompnent.defaultProps = {} insted of param defaults?
defaultProps is used for js. Typescript has another way to declare prop types

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.