TypeScript勉強会第一回(2021/12/28)

## 目次

[TypeScript勉強会第二回（2022/1/17） - ジェネリクス編 -](https://qiita.com/KuwaK/items/3af3ef4ee48402e5b37b)

[TypeScript勉強会第３回 (2022/01/31) 構造的部分型・交差型・共用体型・リテラル型](https://qiita.com/KuwaK/items/5191abdb7c0bcb176e21)

[TypeScript勉強会第4回 (2022/02/21) 組み込みの型関数](https://qiita.com/KuwaK/items/e0e22515793580741377)

## TypeScriptとは

* JavaScriptを人が読みやすくするために型をつけた言語
* 設定により「型の厳しさ」を変更できる
* 強力な型推論機能があり、人が型を書く手間を極力減らすようにしている

---

## TypeScriptの現在地

https://2020.stateofjs.com/en-US/technologies/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93999/aac060f7-b6cf-1c03-b66c-a7214b4266e8.png)

* 着々とユーザーを増やしていて、ユーザーの満足度も高い

---

## なぜTypeScriptを使うのか

例えば以下の関数を考える

```.js
function sum(a,b){
 return a + b;
}
```

JSだと
* 引数の型がわからない
* 文字列を指定してもエラーにならない

---

* 複雑なObjectが存在しても、どんなメンバを持っているのかわかる
* 存在しないメンバにアクセスしたときにエラーになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93999/518ffe4d-636f-8680-6af3-9bad5e3414f6.png)

---

## TypeScriptの基礎の型


[PlayGroundへのリンク](https://www.typescriptlang.org/play?#code/PTAEnDTR1bUdCUFgCgDGB7AdgZwC6iwJwFw6a4CWqA5qALygDkAEgKYA2zytCIogDqaQIoZsqAK4BbQiNEAjRrmqgADJzCB8d0C+CoBIFfmiygS6AELJkzQlOPNGAQ1TziwxstAjWgaPVtg5xOGt5L5k7CqAAmjABmZIzB7kg62MKEQaERqFHySeGRwU6AVQyAawyAHQyA5QyA9QyAEwwxArrIUgBWhADezlaijIR4ZOQANHrB3tKyoAC+8g0IoM2thLRWtF3jvYRK8ENOgLKJ0JVxoFa4BESkFADaALryR3g9eCdOgP0MgOsMgNcMW56YwgAOloQXxJ09kjJcGcaD9cP8xDd4FxAEWp3BeunQYkIAAorP1AT0pOjZABKagAPmcYkB8lRmLxVEJVlAAGpQFIEE5AMQJgGeDDaAJIZABYRgE0GVyAIAYAEqMFC4YKACwZACIMgDEGVyw9mAClcJYBohg8ulwwuQosIQpFwQAPB0KD1MABPd6MZBhUA1WqEmhjeATNHWurzR30wg2hCreBOQCncoBoOUAUHKADCjAHYMrgjgCztQCV-uzAGvKgCiGQAmaRLAPoM-MAYdaASwYw4AWDUAECqAQAZXLHAPYMgA+zQDSDIArBkA8gyAMwZAEEMRcAx3KAU0VAKoMgBiGNOASE1uFXAJEMrnZgArjQBrUYB1Bgbde7Kt9sU8AH08PIGCw2Bwl7pl5J5Msqthl-ojCY7LgHKrj7YaP5r6Bl8J0iFMqlsjvjzbRgtUC02nQsxuhMJB9Io3oPsuuxyCClwHJCXAPM8ZauIA4MZRoAMgyAKP6gCBkUW6FTjWEqFkWyKGpQAA+RIDLgOKnGKk49g2U6AH4MUqQW8nwAaCfzUYCwKgKC4KiJCTiwpGJGAKj63ARmWk6AOYMgCyDERaaAIEM+GYbhkGIqIpLOgCsiYtitEEjstL0oyUJgKyGz5sWo6AHBmgBcnoREpioAWAmABx6YYAPJ1MKmCuGKgCxUYAGtFMaxUqAMoMYqANYMgAXNoA8IaQequrahqooGr8RqgKa5qWi6to-u6zo2sBHqFRBi5cIAmvKAONRllcAAUlYABuVgAMqIKQ7yYLFgAivoA-gyAD3xg3yfKiVMcqJSAJcMgCdDOyQUzoqSoxU2SlKhhRZRYAhgxDgqyokU4LXtV1PWYGGs1zWWfm1AFo6AJm+gD+RjOypqUWHXZeQQW3fd8mAElygDbxoA5AYYYA+K4sd2zFsQ+6CEJ9hyUDQtBhLUADuJBhNuR7WoQv2INgNDoKAXAI50o744FsUdhtjVgIA8DpQIA05osYmEbsoA-vLytyq1ivJUVhoA8qqADIZ7KAMeRgBeNjzMUYbTVmgFF3ZlgAKmajBnSQvWAF9qgCQ5hGsNwwcnTrmEAAWFphFYaPY9sxiev5BPyOgxNcIAFQwzYAPwyxTWSpAA)

---

``` .ts
// 文字列
const str: string = 'Hello'
// 数字
const num: number = 0
// 真偽値
const isBool: boolean = true
// null型
const n: null = null
// undefined型
const u: undefined = undefined
// オブジェクト型
const obj: { name: string, id: number } = {
  name: 'a',
  id: 0
}
// 配列型
const arr: string[] = [str, str]
// タプル型
const tuple: [string, number] = [str, num]
// 関数型
const sum: (a: number, b: number) => number = (a, b) => a + b

// 連想配列を表す型。Recordという型関数を用いる
const record: Record<string, typeof obj> = {
  a: obj,
  b: obj
}

// 以下上記の型の型定義を取り除いた型。殆どの場合、型定義は書かなくても、代入された変数から型を推論してくれる

const _str = 'Hello'
const _num = 0
const _isBool = true
const _n = null
const _u = undefined
const _obj = {
  name: 'a',
  id: 0
}
const _arr = [str, str]
// タプル型は型指定が必要、指定しない場合、(string | number)[]と推論されてしまう
const _tuple: [string, number] = [str, num]

// 関数型の場合、引数の型は推論できないため、指定が必要
const _sum = (a: number, b: number) => a + b

// 連想配列の場合、型を明示しないと通常のObject型と認識されてしまうことに注意
const _record: Record<string, typeof obj> = {
  a: obj,
  b: obj
}

// 余談

// JavaScriptに組み込みで用意されているクラスを型として用いることもできるが、こちらを用いる場合、
// JavaScriptのクラスはObject型を継承しているため、String型とObject型で互換性が生まれてしまう
const s: String = 'fjwif'
const o: Object = s // String型をObject型に代入できる

// 小文字始まりの型を使用することでこの問題を解決することができる
// これはTypeScript固有の型
const ss: string = 'fheofaw'
const oo: object = ss // エラーになる
```