# TypeScript2(学習日:/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`