React+TypeScriptでPropTypesを使う
Page content
JavaScript + PropTypes
PropTypesを使って、Propsの型やRequired
かどうかを指定できる。
import React from "react";
import PropTypes from "prop-types";
...
class SearchContents extends React.Component {
render() {
const {
execSearch,
resetSearch,
handlePopper
} = this.props;
return (
<div>
<Popper
open={open}
anchorEl={anchorEl}
placement="top-end"
transition
>
...
</Popper>
<Fab color="primary" aria-label="Search">
<SearchIcon onClick={handlePopper} />
</Fab>
</div>
);
}
}
SearchContents.propTypes = {
execSearch: PropTypes.func.isRequired,
resetSearch: PropTypes.func.isRequired,
handlePopper: PropTypes.func.isRequired
};
TypeScript + PropTypes
TypeScriptでPropTypesを使う場合は書き方が変わる。
というか、Propsを定義する必要があるので、PropTypesを使うと二重定義になる。
import * as React from "react";
import PropTypes from "prop-types";
...
interface Props {
execSearch: (team: string, name: string) => {[key: string]: string};
resetSearch: () => {[key: string]: string};
handlePopper: (event: React.MouseEvent<SVGSVGElement, MouseEvent>) => {[key: string]: any};
}
class SearchContents extends React.Component<Props> {
static propTypes = {
execSearch: PropTypes.func.isRequired,
resetSearch: PropTypes.func.isRequired,
handlePopper: PropTypes.func.isRequired
};
render() {
const {
execSearch,
resetSearch,
handlePopper
} = this.props;
return (
<div>
<Popper
open={open}
anchorEl={anchorEl}
placement="top-end"
transition
>
...
</Popper>
<Fab color="primary" aria-label="Search">
<SearchIcon onClick={handlePopper} />
</Fab>
</div>
);
}
}
TypeScriptでPropTypesは必要か
じゃあ不要じゃん…となるところだが、TypeScriptのgithubに以下のようなIssueがある。
TypeScriptでbuildする際はPropTypesを書かずとも想定外の型を弾けるが、buildしたものを他者が利用する場合はその限りではない。
他者がTypeScriptを使うのであればいいが、JavaScript等を使う場合、想定外の型も受け入れてしまう。
なので、そのような場合に型の制約をかけたければ、TypeScriptであってもpropTypesを記載する。