Ad
1: 2016-03-19 (土) 06:48:49 njf ソース バックアップ No.1 を復元して編集 現: 2016-03-19 (土) 16:28:32 njf ソース 編集
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を継承した物で無ければエラーが出る。


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom Powered by xpWiki
Counter: 2000, today: 1, yesterday: 0
MenuBar
広告

ログイン

ユーザー名:


パスワード:





パスワード紛失

Portuguese | English | German | Greek | Japanese | Korean | Russian | T-Chinese top
NJF