React × defaultProps × TypeScript

2018-11-28

この書き方が一番ベストかはともかくとして、現時点では以下で統一できそうな気がしています。

import * as React from 'react';

interface HogeProps {
  // 必須のprops
  children: React.ReactNode;
  // 任意のpropsだが、コンポーネント内ではundefinedを許容しない
  className?: string;
  // 任意のpropsだが、コンポーネント内でundefinedを許容する
  onClick?: () => void;
}

const hogeDefaultProps: Required<Pick<HogeProps, 'className'>> = {
  className: '';
}

// 呼び出し側では`className: undefined`が設定可能である
const Hoge: React.SFC<HogeProps> = (
  /*
   * children: React.ReactNode;
   * className: string; ⇒ コンポーネント内では、undefinedが許容されない
   * onClick?: () => void;
   */
  // 厳密には props: HogeProps & Readonly<typeof hogeDefaultProps>
  props: HogeProps & typeof hogeDefaultProps
) => <div {...props} />;

Hoge.defaultProps = hogeDefaultProps;

export default Hoge;

React.Componentも基本は一緒なので、省略。

© 2018 kk-web