一般社団法人 全国個人事業主支援協会

COLUMN コラム

そもそもClassComponentなんて使うなよ

というツッコミは無しで。

 

React.Componentのジェネリクスにpropsの型を指定しても、

defaultPropsに型はつかない。

 

さらに追加でいうと、

デフォルト値があるプロパティはオプショナルにしたいところだが、

それだとpropsの参照にundefinedが混ざる。

デフォルト値で補完されるはずなので、それはうまくない。

 

こんな問題に遭遇したくなければ、

[1] propsはすべてオプショナルに

[2] defaultPropsは設定しない

の2点に気を使えば、とても綺麗である。

 


interface Props {

id?: number;

name?: string;

}

 

class Hoge extends React.Component<Props, State> {


 

でも現実はそううまくいかない。

 

props.idは必須にしたい!とか

props.nameのデフォルトは’太郎’がいい!

という状況もきっとあるだろう。

ここで最初の話である。

 

この場合、

(1) Props型は必須とオプショナルの二つが混ざる

(2) defaultPropsの型を別途定義しなければならない

(3) propsの参照時は Required<Props>になるはず

を満たせば良さそう。

 


const defaultProps = {

name: ‘太郎’

};

 

type DefaultProps = typeof defaultProps;

 

interface Props extends Partial<DefaultProps> {

id: number;

}

 

class Hoge extends React.Component<Props, State> {

public static defaultProps = defaultProps;

 

render() {

const { id, name } = this.props as Props & DefaultProps;


 

ちょっとめんどいけど、こんな感じだといい感じだ。

 

propsの参照のたびにキャストするのも面倒なので、

Getterを用意しておくと楽かも。(ただしちょいきもちわるい

 


private get cProp() {

return this.props as Props & DefaultProps;

}

 

render() {

const { id, name } = this.cProps;


 

The following two tabs change content below.

江尻 翔

フリーでSEをしています。 バックエンドから逃げて、 現在はフロントエンドメインでお仕事中。

最新記事 by 江尻 翔 (全て見る)

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア