TypeScriptでもジェネリクスをインスタンス化したい
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()