Reactを業務で使うようになって○ヶ月、まだ自分がレビューする機会が無いので、ここでレビューの練習をしてみたいと思います。
前提
- Typescriptで書いている
- buildツールはesbuild
お題
実際にプロダクト内で見かけたコードを簡素にしたものです。
import React from 'react'; import { useLangContext } from 'react-i18next'; type nameProps = { name: string; } export default function MyComponent(props: nameProps) { const { i18nTextTable: T } = useLangContext(); return ( <div> {T('hello')}, {props.name}! </div> ); }
レビュー
気になる点①:型の命名規約
type nameProps
としていますが、Typescriptでは、型の命名にはPascalCaseを使うことが一般的です。
type NameProps
の方が適切だと思います。
気になる点②:default exportの利用
esbuildの公式ドキュメントを確認すると、 https://esbuild.github.io/content-types/#default-interop
デフォルトエクスポートは解釈方法が複数あり、間違った解釈から、予期しないエラーが引き起こされることがあるようです。
また、デフォルトエクスポートは呼び出し側で自由に名前を変更できるため、名前の一貫性が保証されません。特別な理由がない限り、名前付きエクスポートを使用した方がいいのではないでしょうか?
気になる点③:propsの分割代入
export default function MyComponent(props: NameProps) {
これだと、コンポーネントに予期しないpropsが渡されるリスクがあり、最悪コンポーネントが壊れてしまいます。
export default function MyComponent({name}: NameProps) {
このように、分割代入を利用すれば、この一行は長くなってしまいますが、プロパティを明示して利用でき、 使う時に{props.name}ではなく、{name}として使うことができます。
気になる点④:翻訳関数の命名
const { i18nTextTable: T } = useLangContext();
ここでT
は略称でしょうか。そうであるならば、別の略称を使った方が良いと思われます。TypescriptでT
は型引数のことなので、混同する可能性があるからです。
translate
やtext
などを使う方がi18nを使用してることを明示できるかもしれません。