TypeScriptで書けるようになりたい。type-challengesで基礎力を高める。

TypeScriptが書けるようになりたい1児の父です！
先日1歳になって、日々の成長が目覚ましいのを目の当たりにしていると自分も成長しなければと思います…

だからというわけではないですが…「TypeScriptを知ってるよ！」から「TypeScriptを書けるよ！」になるため、
継続して勉強していけるための工夫の一つとして勉強したことをアウトプットしていくことに決めました！

## 勉強方法
どんな勉強方法が良いかと考えていましたが…

### type-challenges
個人的には多少なりとも勉強していたこともあったのでオススメされた下記をやってみることにしました。

https://github.com/type-challenges/type-challenges

### サバイバルTypeScript

「サバイバルTypeScript」も気になったので、こちらも並行して進めたいと思います！

https://typescriptbook.jp/

### これまでで利用したコンテンツ
これまでに下記の有料のコンテンツで勉強しました。
動画でのハンズオン形式で、解説も丁寧なので非常にわかりやすかったです！

https://pro.diveintohacking.com/

## TypeScriptってなに？
TypeScriptはMicrosoftにより2012年10月1日に発表されたものらしいです。
最近耳にすることが多くなりましたが、ずいぶん前からあることに驚きです！

:::note info
**TypeScriptの特徴**
- JavaScriptに型が追加され、それ以外の部分は基本的に互換性がある
- 型があることでコンパイル時にミスに気がつくことができる
- JavaScript100％で記述してもTypeScriptのコンパイラーは解析してくれる
:::

TypeScriptを学ぶというのはJavaScriptを学ぶことが必須。
JavaScriptも同時に学んでいかないといけないので学習コストは高めかもしれないです…。

「TypeScript誕生の背景」は面白かったで興味ある方は読んでみてください！

https://typescriptbook.jp/overview/before-typescript

## type-challengesの始め方

### type-challengesのGitHubページへアクセス
ページにアクセスしてスクロールすると「[Challenges](https://github.com/type-challenges/type-challenges#challenges)」と書かれた箇所にタグがたくさんあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/84736e68-9fc5-7bdc-48a7-b76ceb62b336.png)

### type-challengesの課題を選択する
タグをクリックすることで課題に取り組むことができます！
赤枠で囲まれた「Hello World」のタグをクリックします。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3134363631322f38343733366536382d396663352d376264632d343861372d6237366365623632623333362e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/59cc9cdd-fa2e-1849-2444-5aa9644caa6d.png)

課題のページが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/b9eff68d-281b-769f-f825-7023c7d09b82.png)

ページには下記のコードを編集してテストに合格するようにと書かれています。
```TypeScript
// expected to be string
type HelloWorld = any
```
「Take the Challenge」のボタン（画像の赤枠部分）を押してチャレンジしてみます！
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3134363631322f62396566663638642d323831622d373639662d663832352d3730323363376430396238322e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/05637cbb-4d3c-a873-3e14-7171cdebbd4c.png)

### 課題に取り組む
クリックするとTypeScriptの実行環境が開きます。
開いた時点では右側の「Errors」でエラーが出ているのがわかるのでこちらを解消していけばいいかと思われます！

ページをスクロールすると「Your Code Here」とあるのでそちらを編集していきます！
編集すれば自動で実行されて結果が出ます。

テストケースは「Your Code Here」のすぐ下に「Test Cases」とあるところに記載してあるので参考にすれば修正方法がわかるかと思います！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/a51102e5-c918-55ec-4a0c-57b085f6cbc2.png)

### コードを修正する
/* _____________ Your Code Here _____________ */
```diff_typescript
- type HelloWorld = any
+ type HelloWorld = string

/* _____________ Test Cases _____________ */
import type { Equal, Expect, NotAny } from '@type-challenges/utils'

type cases = [
  Expect<NotAny<HelloWorld>>,
  Expect<Equal<HelloWorld, string>>,
]
```

これでエラーは消えます。

### 回答を確認する
課題が書かれていたページの右下にある「Check out Solutions」をクリックします。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3134363631322f62396566663638642d323831622d373639662d663832352d3730323363376430396238322e706e67 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/b7735c3e-55bf-dfa8-50f9-1a437f69a7ce.png)

Issueの一覧が出てくるので自分と同じ回答がないか探します。
すでにClosedになっているものから探すのが良いかと思います！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/888a7889-4d76-ee71-8f03-b4833cb11273.png)

## まとめ
始めたばかりですが、かなりの筋トレになりそうです。
Issueの中には自分とは違う回答の方もいらっしゃるので人のコードをみてそんな書き方もあるのかと学びにもなります！

これからTypeScriptを始める人、今頑張って勉強している人は是非学習方法の一つとして検討してみてください！