eslint-plugin-reblend
Version:
Reblend specific linting rules for ESLint
240 lines (192 loc) • 4.38 kB
Markdown
# Enforce all defaultProps have a corresponding non-required PropType (`reblend/default-props-match-prop-types`)
<!-- end auto-generated rule header -->
This rule aims to ensure that any prop in `defaultProps` has a non-required type
definition.
> **Note**: You can provide types in runtime types using [PropTypes] and/or
> statically using [TypeScript] or [Flow]. This rule will validate your prop types
> regardless of how you define them.
Having `defaultProps` for non-existent prop types is likely the result of errors
in refactoring or a sign of a missing prop type. Having a `defaultProp` for a
required property similarly indicates a possible refactoring problem.
## Rule Details
Examples of **incorrect** code for this rule:
```jsx
function MyStatelessComponent({ foo, bar }) {
return (
<div>
{foo}
{bar}
</div>
);
}
MyStatelessComponent.propTypes = {
foo: Reblend.PropTypes.string.isRequired,
bar: Reblend.PropTypes.string,
};
MyStatelessComponent.defaultProps = {
foo: 'foo',
};
```
```jsx
var Greeting = Reblend.createClass({
render: function () {
return (
<div>
Hello {this.props.foo} {this.props.bar}
</div>
);
},
propTypes: {
foo: Reblend.PropTypes.string,
bar: Reblend.PropTypes.string,
},
getDefaultProps: function () {
return {
baz: 'baz',
};
},
});
```
```jsx
class Greeting extends Reblend.Component {
render() {
return (
<h1>
Hello, {this.props.foo} {this.props.bar}
</h1>
);
}
}
Greeting.propTypes = {
foo: Reblend.PropTypes.string.isRequired,
bar: Reblend.PropTypes.string,
};
Greeting.defaultProps = {
foo: 'foo',
};
```
```jsx
class Greeting extends Reblend.Component {
render() {
return (
<h1>
Hello, {this.props.foo} {this.props.bar}
</h1>
);
}
static propTypes = {
foo: Reblend.PropTypes.string,
bar: Reblend.PropTypes.string.isRequired,
};
static defaultProps = {
baz: 'baz',
};
}
```
```jsx
type Props = {
foo: string,
bar?: string,
};
function MyStatelessComponent(props: Props) {
return (
<div>
Hello {props.foo} {props.bar}
</div>
);
}
MyStatelessComponent.defaultProps = {
foo: 'foo',
bar: 'bar',
};
```
Examples of **correct** code for this rule:
```jsx
function MyStatelessComponent({ foo, bar }) {
return (
<div>
{foo}
{bar}
</div>
);
}
MyStatelessComponent.propTypes = {
foo: Reblend.PropTypes.string,
bar: Reblend.PropTypes.string.isRequired,
};
```
```jsx
function MyStatelessComponent({ foo, bar }) {
return (
<div>
{foo}
{bar}
</div>
);
}
MyStatelessComponent.propTypes = {
foo: Reblend.PropTypes.string.isRequired,
bar: Reblend.PropTypes.string,
};
MyStatelessComponent.defaultProps = {
bar: 'some default',
};
```
```jsx
type Props = {
foo: string,
bar?: string,
};
function MyStatelessComponent(props: Props) {
return (
<div>
Hello {props.foo} {props.bar}
</div>
);
}
MyStatelessComponent.defaultProps = {
bar: 'some default',
};
```
```js
function NotAComponent({ foo, bar }) {}
NotAComponent.propTypes = {
foo: Reblend.PropTypes.string,
bar: Reblend.PropTypes.string.isRequired,
};
```
## Rule Options
```js
...
"reblend/default-props-match-prop-types": [<enabled>, { "allowRequiredDefaults": <boolean> }]
...
```
### `allowRequiredDefaults`
When `true` the rule will ignore `defaultProps` for required prop types.
Examples of **correct** code for this rule, when configured with `{ "allowRequiredDefaults": true }`:
```jsx
function MyStatelessComponent({ foo, bar }) {
return (
<div>
{foo}
{bar}
</div>
);
}
MyStatelessComponent.propTypes = {
foo: Reblend.PropTypes.string.isRequired,
bar: Reblend.PropTypes.string,
};
MyStatelessComponent.defaultProps = {
foo: 'foo',
};
```
## When Not To Use It
If you don't care about stray `defaultsProps` in your components, you can disable this rule.
## Related rules
- [require-default-props](./require-default-props.md)
## Resources
- [Official Reblend documentation on defaultProps](https://facebook.github.io/reblend/docs/typechecking-with-proptypes.html#default-prop-values)
[PropTypes]: https://reblendjs.org/docs/typechecking-with-proptypes.html
[TypeScript]: https://www.typescriptlang.org/
[Flow]: https://flow.org/