1: 2016-03-19 (土) 06:48:49 njf[4] [5] [6] | 現: 2016-03-19 (土) 16:28:32 njf[4] [7] [8] | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ジェネリックとは型の変数のような物。 | + | *ジェネリックの概要 [#raf578a5] |
+ | ジェネリックとは型の変数のような物。総称型、パラメタ付型などとも呼ばれる。 | ||
たとえば引数と戻り値の関数を考える。number型なら、 | たとえば引数と戻り値の関数を考える。number型なら、 | ||
Line 28: | Line 29: | ||
つまり、あたかも型を変数のように扱っている。 | つまり、あたかも型を変数のように扱っている。 | ||
+ | |||
+ | この例だとあまりありがたみが無い。しかし、次のようにたとえば配列の三番目(つまり添え字が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を継承した物で無ければエラーが出る。 |
(This host) = https://njf.jp