TypeScriptでもジェネリクスをインスタンス化したい

C# だとジェネリクスの型パラメータは実行時にも利用できる

using System;  

var factory = new Factory();
factory.LogType<Car>(); // Car

class Car
{
  string color = "red";
}

public class Factory
{   
    public void LogType<T>() {
      Console.WriteLine(typeof(T).Name);
    }
}

TypeScriptによる型はコンパイル時にはすべて取り除かれるため、実行時には利用できない。(typeofで型は取り出せない。)そのためメソッドの引数から推論させ、それを利用する

class Car {
  color = "red";
}

class Factory {
    logType<T>(type: (new () => T)): void {
        console.log(JSON.stringify(new type()))
    }
}

let factory = new Factory();
factory.logType(Car); // "{"color":"red"}" 

TypeScriptは構造的型付けなので、型は構造で表現される。いわゆるダックタイピング

構造的型付けは、一見して直感には反するかもしれない。例えば以下のコードはエラーにならない。CarクラスはEmptyクラスのプロパティをすべて持っているとみなされるため

class Empty {}

class Car {
  color = 'red';
}

let empty: Empty = {};
empty = new Car()