Skip to content
kontan edited this page Apr 21, 2013 · 11 revisions

TypeScript 0.9 移行メモ

ジェネリクス

構文

オブジェクト型リテラルでもちゃんと型パラメータを持てる。

var id: { <T>(t: T):T; };

オーバーロードするときは注意。

function hoge<T>(x: number): T;  ← このTと
function hoge<T>(x: string): T;  ← この T は別物。
function hoge<T>(x: any): T {    ← この T とも別物なので、本体ではここは any にしておく必要がある。
    return null;
}

void, undefined

class Hoge<T>{
}

var hoge: Hoge<void>;  // え?
var piyo: Hoge<undefined>;
// var puyo: Hoge<null>; // これはダメ

そのほか変更

省略可能な引数と引数のデフォルト値

省略可能な引数でかつデフォルト値のある引数は、? をつけないことになった

問題

静的メソッドでのジェネリクス

静的メソッドでうまくいかない

class Hoge{
    static hoge<S>(s: S){
    }
}

静的メソッドで型パラメータを引数や返り値で使うとエラーになる。 型パラメータの定義だけなら問題はないので、バグっぽい。

型パラメータ付きメソッドのオーバーライド

class A{
    f<T>(t: T){
    }
}

class B extends A{
    f<T>(t: T){
    }
}

この場合、 T はクラスをまたいでいるので、A.f の T と B.f の T は別物だと見なされてしまうらしい。 そのため T に互換性がないといわれてしまう。 バグっぽく見えるが、仕様なのかも。

複数の型パラメータの推論

バグっぽい。単一の型パラメータだと大丈夫

interface C<T>{
}

function f<S,T>(s:C<S>, t:C<T>): void{
}	
var a: C<string>;
f(a, a);                // NG
f<string,string>(a, a); // OK