PropTypesでまたハマったので備忘録を残す。
とりあえずeslint-plugin-react周りをアップデート
eslint-plugin-react周りが、eslint-plugin-jsx-a11yに対応してくれたみたいなので、
こんな感じでアップデートしたら、またeslintが騒ぎ出した。
package.json
diff --git a/package.json b/package.json
@@ -43,12 +43,12 @@
"babel-preset-stage-3": "6.17.0",
"babel-runtime": "^6.20.0",
"css-loader": "^0.26.1",
- "eslint": "^3.12.2",
- "eslint-config-airbnb": "^13.0.0",
+ "eslint": "^3.13.1",
+ "eslint-config-airbnb": "^14.0.0",
"eslint-loader": "^1.6.1",
"eslint-plugin-import": "^2.2.0",
- "eslint-plugin-jsx-a11y": "^2.2.3",
- "eslint-plugin-react": "^6.8.0",
+ "eslint-plugin-jsx-a11y": "^3.0.2",
+ "eslint-plugin-react": "^6.9.0",
考察
下記を見るに、{props.children}
で渡してるところのpropTypeが悪いようだ。
最初は、型名が変わったのかなと思ったけど、Requiredなら明記しろってことみたい。
該当するコード
Template.jsx
import Helmet from 'react-helmet';
const Template = props => (
<div>
<Helmet defaultTitle="jey3dayo.net" />
{props.children}
</div>
);
Template.propTypes = {
children: React.PropTypes.shape({}),
};
export default Template;
警告内容
app/containers/Template.jsx
14:3 error propType "children" is not required, but has no corresponding defaultProp declaration react/require-default-props
対応
上記で述べた通り、isRequired
追記したら黙った。
今後は、propTypes書くときは、Requiredなものか明示的に記載しなければならないようだ。
Template.jsx
diff --git a/containers/Template.jsx b/containers/Template.jsx
index 750be92..6dde794 100644
--- a/containers/Template.jsx
+++ b/containers/Template.jsx
@@ -9,8 +9,7 @@ const Template = props => (
);
Template.propTypes = {
- children: React.PropTypes.shape,
+ children: React.PropTypes.shape.isRequired,
};
export default Template;