ジェネリックの概要 anchor.png Edit

ジェネリックとは型の変数のような物。総称型、パラメタ付型などとも呼ばれる。 たとえば引数と戻り値の関数を考える。number型なら、

function testFunction(n:number):number{
    return n;
}

となる。

引数と戻り値が同じという条件のみ課したいが、

function testFunction(n:any):any{
    return n;
}

としてしまうとそうはならない。

そこで、ジェネリックを使う。

function testFunction<T>(n:T):T{
    return n;
}

使うときは、「<T>」の部分に型を入れる。

console.log(testFunction<number>(2)); // => 2
console.log(testFunction<string>("string")); // => string

つまり、あたかも型を変数のように扱っている。

この例だとあまりありがたみが無い。しかし、次のようにたとえば配列の三番目(つまり添え字が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{
    //何か処理
}
Page Top

ジェネリックの型 anchor.png Edit

型定義にもジェネリックは使える。

var func: <T>(n: T[])=>T = getThird;

こちらの書き方でも良い。

var func: {<T>(n: T[]):T} = getThird;

インターフェイスにも利用できる。

interface GenericGetThird {
    <T>(n: T[]):T;
}
Page Top

クラス定義でのジェネリック anchor.png Edit

クラス定義でもジェネリックは利用できる。

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));//エラー
Page Top

ジェネリックを継承で制限 anchor.png Edit

<T extends BaseClass>

と書くとTはBaseClass編集を継承した物で無ければエラーが出る。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom Powered by xpWiki
Counter: 530, today: 1, yesterday: 2
初版日時: 2016-03-19 (土) 15:48:49
最終更新: 2016-03-19 (土) 17:28:32 (JST) (550d) by njf
広告

ログイン

ユーザー名:


パスワード:





パスワード紛失


NJF