1: 2016-03-19 (土) 06:48:49 njf |
現: 2016-03-19 (土) 16:28:32 njf |
- | ジェネリックとは型の変数のような物。 | + | *ジェネリックの概要 [#raf578a5] |
| + | ジェネリックとは型の変数のような物。総称型、パラメタ付型などとも呼ばれる。 |
| たとえば引数と戻り値の関数を考える。number型なら、 | | たとえば引数と戻り値の関数を考える。number型なら、 |
| | | |
| | | |
| つまり、あたかも型を変数のように扱っている。 | | つまり、あたかも型を変数のように扱っている。 |
| + | |
| + | この例だとあまりありがたみが無い。しかし、次のようにたとえば配列の三番目(つまり添え字が2)の要素を返す関数を考えてみると利点がわかる。 |
| + | |
| + | function getThird<T>(n:T[]):T{ |
| + | return n[2]; |
| + | } |
| + | |
| + | console.log(getThird<number>([1,2,3,4])); // => 3 |
| + | console.log(getThird<string>(["one","two","three","four"])); // => three |
| + | |
| + | このような配列の要素を返したり、引数の配列を返したりする場合には、ジェネリックは任意の型に対して整合性をチェックできる。 |
| + | |
| + | 二つ以上のジェネリックを定義するときは、「<>」の中にコンマ区切りで列記する |
| + | |
| + | function testFunc<U,T>(U,T):U{ |
| + | //何か処理 |
| + | } |
| + | |
| + | *ジェネリックの型 [#rd25308b] |
| + | |
| + | 型定義にもジェネリックは使える。 |
| + | |
| + | var func: <T>(n: T[])=>T = getThird; |
| + | |
| + | こちらの書き方でも良い。 |
| + | var func: {<T>(n: T[]):T} = getThird; |
| + | |
| + | インターフェイスにも利用できる。 |
| + | interface GenericGetThird { |
| + | <T>(n: T[]):T; |
| + | } |
| + | |
| + | |
| + | *クラス定義でのジェネリック [#f6c4b07e] |
| + | |
| + | クラス定義でもジェネリックは利用できる。 |
| + | |
| + | class TestClass<T>{ |
| + | x:T; |
| + | concat(x:T,y:T):T[]{ |
| + | this.x = x; |
| + | return [x,y]; |
| + | } |
| + | } |
| + | var numCat:TestClass<number> = new TestClass<number>(); |
| + | var strCat:TestClass<string> = new TestClass<string>(); |
| + | |
| + | console.log(numCat.concat(1,2));// => [1,2] |
| + | console.log(numCat.x);// => 1 |
| + | console.log(strCat.concat("one","two"));// => ["one","two"] |
| + | console.log(strCat.x);// => "one" |
| + | |
| + | console.log(strCat.concat(1,2));//エラー |
| + | |
| + | *ジェネリックを継承で制限 [#o334a46a] |
| + | |
| + | <T extends BaseClass> |
| + | |
| + | と書くとTはBaseClassを継承した物で無ければエラーが出る。 |