![見出し画像](https://assets.st-note.com/production/uploads/images/73176354/rectangle_large_type_2_d384f994aa987976118f9f90ea6032a1.jpeg?width=800)
TypeScript 入門の記録(6)作って学ぶTypeScript
前回は、Create React App をインストールして、TypeScriptテンプレートを実行したり、少し変更して自動的にコンパイルと再表示されることを確認しました。今日は、サバイバルTypeScript の、作って学ぶTypeScriptを順番にやろうと思います。わくわく。
作って学ぶTypeScript
簡単な関数を作ってみよう
まずは、Javascript で関数を記述します。
![](https://assets.st-note.com/img/1645915136864-hNjfoiwhVz.png)
実行して、パラメータを整数から文字列に変更したときの実行結果を確認します。
![](https://assets.st-note.com/img/1645915273210-DOCr9hr7uy.png?width=800)
![](https://assets.st-note.com/img/1645915356847-LRdGjJ40hJ.png?width=800)
numに999を渡すと、num+1は999+1 =1000ですが、num に"999"を渡すと、num+1は、"999"+"1"と解釈されるので、結果は "9991" になります。算術演算なのか文字列の連結なのかを、渡された引数の型によって使い分けてくれちゃうんですよね。これが原因で想定しない結果になったりするので、注意が必要だと思っています。
では、increments.jsをincrements.tsにファイル名を変更して、パラメータnumに型注釈: number を追加します。
![](https://assets.st-note.com/img/1645916519409-1tjURiGPx4.png?width=800)
コンパイルすると、console出力で呼び出している関数 increment() のパラメータの型が合っていないと言われます。コードの編集時点で、すでにパラメータ”999”の下に波線のアンダーラインが表示されて「ここに問題がありますよ」って教えてくれています。VS Code に限らないと思いますが、型注釈が追加されたことで、エディタが「increment関数のパラメータに文字列が設定されているのはおかしいですよ」ってヒントをくれます。コンパイル型言語の経験が長い私にとって、この「型強制がある」って、安心感がありますね。これは、良いなぁ。
先ほど、
mv increment.js increment.ts
で、increment.js を increment.ts にファイル名を変えたのですが、コンパイル後、increment.js ができていました。これはincrement.ts のコンパイル結果として出力された Javascript なのですね。
![](https://assets.st-note.com/img/1645924475264-LnigoCpX7v.png?width=800)
パラメータには、型注釈がなく、先ほどコンソール出力のパラメータを文字列"999"としていた箇所も999に修正されています。このコンパイル結果のJavascript を実行するんですね。へぇ。
Reactでいいねボタンを作ろう
さて、次のチュートリアル、Reactでいいねボタンを作ろうをやってみます。
Reactの3大特徴、仮想DOM、宣言的UI、コンポーネントベースの簡単な解説があるので、飛ばさずに読みます。前にReactの公式チュートリアル三目並べでは内容の理解は置いといてコードを編集していたので、今回は仕組みを理解しながら進めていきたいです。Reactでは、仮想DOMを操作して、それがDOM、さらに画面出力に反映されるという仕組みなんですね。宣言的UIもコードがすっきりして、見通しが良いです。三目並べでは、ひたすらコンポーネントを組み合わせていたのですが、公開コンポーネントを利用できるところも含み、合理的だと感じた部分です。さて、このチュートリアルではパッケージ管理ツール「Yarn」を使うので、インストールします。
![](https://assets.st-note.com/img/1645946337418-y5aSWlJ5W3.png?width=800)
![](https://assets.st-note.com/img/1645946499078-cEax7D16X8.png?width=800)
生成された like-buttonディレクトリに移動して、yarn start を実行して、React のローカル開発サーバーを起動すると、ブラウザが自動起動して雛形ページが開きます。
![](https://assets.st-note.com/img/1645947500600-11OWx8S8Cf.png?width=800)
あれ?Edit src/App.jsって、これ、TypeScriptのテンプレートじゃないでは!!!
![](https://assets.st-note.com/img/1645948558075-Bc5rksRBE1.png?width=800)
やりなおし!!!先ほど生成されたlike-buttonを削除して、やり直します。
![](https://assets.st-note.com/img/1645948851404-Lflm50ricw.png?width=800)
![](https://assets.st-note.com/img/1645949226137-FegzNFpU2v.png?width=800)
![](https://assets.st-note.com/img/1645949993448-qERSKmLJYF.png?width=800)
![](https://assets.st-note.com/img/1645950354455-wBTuJPSfac.png?width=800)
![](https://assets.st-note.com/img/1645950536643-mBk7C33LH7.png?width=800)
![](https://assets.st-note.com/img/1645950581603-qXu90j0Jcb.png?width=800)
関数がタグとして使えるので、コードが見やすくなりますね。複雑な処理でも、「ここはこういう処理をする部品です。」って書けるのは、わかりやすいし、コンポーネントを組み合わせたときにも把握しやすそうです。
さて、ここからいよいよ「いいねボタン」を作り込んでいきます。いいねボタンには、いいねの数を表示したいので、LikeButton関数に、いいねの数を変数として定義して、これを表示するように記述します。
![](https://assets.st-note.com/img/1645960472104-ySjFPiA5rx.png?width=800)
{}の中に、変数や式が書けるのですね。ここでは、countの値を返却するので、{count}と記述しました。さらに、ボタンのスタイルを、App.cssに追加しました。
![](https://assets.st-note.com/img/1645960740668-QMzUvVR6xJ.png?width=800)
![](https://assets.st-note.com/img/1645960829600-bOx6P42dKV.png?width=800)
固定値を表示できたので、今度は、ボタンをクリックしたら、その回数を表示するようにしていきます。React の useState関数を使って、カウントの状態をReactに管理させるようにします。
![](https://assets.st-note.com/img/1645961650182-WGZmhkSTs8.png?width=800)
const [count, setCount] = useState(999);
は、useStateの戻り値をcountとsetCountの2つの変数に代入していて、countには、999のような値が、setCountにはcountの値を変更する関数が代入されます。ふむふむ。それぞれ役割が違うんですね。次に、ボタン部分をクリックしたときのハンドラを追加します。
![](https://assets.st-note.com/img/1645962147008-r1DJFyP4Qm.png?width=800)
![](https://assets.st-note.com/img/1645962222063-gjLqZ9Yh4C.png?width=800)
まとめ
React 公式チュートリアルの三目並べでは、stateをどう渡すか?を次々に変更していくのを追っかけるだけで精一杯で、中身の理解ができていませんでしたが、この小さい機能だと、カウントの状態をReactが管理する様子がわかりやすいと感じました。TypeScriptとReact両方を並行して学習していきたいので、段階的に複雑な構造のアプリケーションにしていきながら、理解を深められたらと思います。さて、今日の学習はここまで。
この記事が気に入ったらサポートをしてみませんか?