yaakaito.org

TypeScriptでのコンストラクタ関数の扱い

JavaScript, TypeScript

こんにちは!うきょーです! JavaScriptでコンストラクタ関数を

1
2
3
var Hoge = function(){ }
var Fuga = Hoge;
var fuga = new Fuga();

こういう感じに使うのって割とやると思うんだけど、TypeScriptだとどういう扱いになってるのか試してみる。

tscは0.9 alpha

とりあえず

こんな感じにしてみる

1
2
3
4
5
6
class Hoge {
    constructor() { }
    method() { }
}

var Hoge2 = Hoge;

これは普通に通って、JavaScriptだとこうなる、普通。

1
2
3
4
5
6
7
8
9
var Hoge = (function () {
    function Hoge() {
    }
    Hoge.prototype.method = function () {
    };
    return Hoge;
})();

var Hoge2 = Hoge;

ここでHoge2がどういう型になっているかというと、こうなっている。

1
new() => Hoge

コンストラクタで引数を取るようにするとこうなる

1
2
3
class Hoge {
    constructor(public fuga: string) { }
}
1
new(fuga: string) => Hoge

これは普通に型として使えるので、厳密に書くと、

1
var Hoge2:new(fuga: string) => Hoge = Hoge;

こういう感じになる。とりあえず問題なく扱える感じがする。

Genericsとの組み合わせとか

結構感動したのがこれ。

1
2
3
4
5
6
7
8
9
10
class Hoge {
    constructor() { }
}

class Fuga<T> {
    constructor(public TT: new() => T) { }
    public create(): T {
        return new this.TT();
    }
}

こういう感じにすることができる。 で、これは、

1
var fuga = new Fuga(Hoge);

という感じにすると推論される。コンストラクタの形の違うクラスを使ってみると、

1
2
3
4
5
class Foo {
    constructor(public fuga: string) { }
}

var fuga2 = new Fuga(Foo);
1
error TS2081: Supplied parameters do not match any signature of call target.

すごいぞTypeScript。