0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

自作アプリのJSX→TSX移行:TypeScriptという「ガードレール」

0
Posted at

はじめに

JavaScriptと比較して、TypeScriptは開発中に自分を守ってくれるガードレールのような存在です。
正直なところ、「最初からTypeScriptで書いておけばよかった!」というのが今の本音ではありますが、今回は勉強も兼ね、そして今後アプリを機能拡張していくことを考えて、既存のJSX(JavaScript)で作成していたアプリをTSX(TypeScript)へ書き換えてみました。

書き換えの過程で学んだポイントを3つに絞ってまとめます。


1. 表示させる単語データの型定義(interfaceの活用)

データの構造を明確にするため、interfaceを使用して型を定義しました。

単語一つの型を定義

interface WordItem {
  en: string;
  jp: string;
  emoji: string;
}

データの全体構造を定義

ネストされたデータ構造も、以下のように定義することで整理されます。

interface DataStructure {
  magic: WordItem[];
  themes: {
    animals: WordItem[];
    foods: WordItem[];
  };
}

学んだこと:

単語一つの型から全体の構造まで定義しておくことで、今後のアップデート(単語やテーマの追加)の際も、エラーにならない形で安全にデータ拡張ができるようになります。

2. 親(App.tsx)から子(Game.tsx)へのProps受け渡しの厳格化

コンポーネント間でのデータのやり取りに型を導入しました。

App.tsx 内での呼び出し例

<Game 
  magicData={FUSION_DATA.magic} 
  themeData={FUSION_DATA.themes[selectedTheme]} 
  onBack={goToHome}
/>

学んだこと:

受け渡すデータが「WordItemの配列であること」などを型で保証することで、子コンポーネント側で誤ってデータを別の型(数値など)として扱おうとした際、TypeScriptが即座に警告を出してくれます。 開発中のミスを未然に防げるようになりました。

3. イベントの型と型推論

関数の定義についても、TypeScriptの恩恵を感じるポイントがありました。

const goToHome = () => setStatus('home');

学んだこと:

コード自体はJavaScriptの時と変わりませんが、TypeScript環境であればこれを見ただけで**「引数がなく、何も返さない(void型)関数」**だと自動的に理解(型推論)してくれます。開発者がいちいち説明しなくても、コードが自身の役割を語ってくれる安心感があります。

まとめ:移行を終えて

JavaScriptからTypeScriptへの移行は「後からやると大変」な面もありますが、一度型というガードレールを設置してしまえば、エディタが常に自分をサポートしてくれるようになります。

特にデータの受け渡しが多いReact開発において、この安心感は代えがたいものだと実感しました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?