---
# System prepended metadata

title: TypeScript２（学習日：/10/19）
tags: [TypeScript]

---

# TypeScript２（学習日：/10/19）
## ジェネリクス
### ジェネリクスとは
使われるまで型が決まらないような、様々な型を受け入れられる機能を作る際に用いられる。
関数本体の定義時に、任意の文字を型であるかのように利用できる。
引数名は通常大文字を用いる。<>の中に型名が自由に入る。
```typescript=
function multiply<T>(value: T, n: number): Array<T>{
    const result: Array<T> = [];
    result.length = n;
    result.fill(value);
    return result;
}
```
ジェネリクスの型パラメータは、関数本体の中でアクセスするとエラーとなる。（unknown）
extendsを用いて、Tの型を指定できる。（一部機能を関数の外に出す）

### 型パラメータの自動解決
TypeScriptは、入力値の型などから、型パラメータを推論しようとする。すべての型が解決可能であれば、型パラメータの指定を省略できる。
引数が一つ決まると、そこから次の文字列の情報を予想し、連鎖的に型の制約を解決している。

### ジェネリクス文法でできること、できないこと
＜＋:できること＞
+ ジェネリクス文法の特長は、利用する側の手間を減らしつつ、型チェックをより厳格にすることである。
+ また、特定の条件を満たすパラメータのみを受け取れる。（特殊化は不可）

＜－:できないこと＞ 
* 指定された型によってロジックを切り替えることはできない
* 即値の数値を型パラメータに入れたり、漸化式のような型定義をしたりと、C++で可能な一部機能は利用できない。
* JavaScriptに変換できないものは型定義できない。

### ユーティリティ型
組み込み型変換のためのユーティリティ型が定義される。
1. オブジェクトに対するユーティリティ型
* Partial(T): 要素が省略可能。
* Readonly: 要素が読み込み専用になった型。
* Required:Partial　省略可能な要素は必須。

2. オブジェクトと属性名に対するユーティリティ型
* Record（K,T) Mapが型のようなデータを作成。
* Pick(T,K)　Kだけを持つ型を作成
* Omit(T,K)　Kだけを持たない型を作成
* 
3. 型の集合演算に対するユーティリティ型
* Exclude（T,U) Uの構成要素以外の合併型を作る。
* Extract(T,U)　Uの両方に含まれる合併型を作る。
* NonNullAble(T) undefined以外の合併型を作る。
* 
4. 関数・クラスのユーティリティ型
* Return Type(T) 過去の大会の優勝カップ
* This　Type（T）　thisの外挿を表現する。
* --noImplicitThis 　this typeを動かすための要素
* 

### any, unknown, 合併型の違い
anyやunknownの変数に値を設定すると、型情報がリセットされる。
再度型情報を入力しなければ、補完ができない。
また、合併型は型の補完時に余計な型情報が混じるので、型ガードで必要な型である保証が必要である。


###### tags: `TypeScript`

