コンストラクタのシグネチャが同じクラスなら何でもnew
できる関数を作るにはジェネリクスを使う。
大まかな流れ:
- コンストラクタのシグネチャを定義した型を宣言する
- その型を関数の引数にする
サンプルコード:
// 引数がゼロのコンストラクタを持つクラスの型を定義する
type NoParameterConstructor<A> = new () => A
// 同じコンストラクタを持つクラスならnewできる関数
function create<A>(a: NoParameterConstructor<A>): A {
return new a()
}
// NoParameterConstructorを満たすクラス(つまり同じコンストラクタを持つ)
class ClassA {}
class ClassB {}
console.log(create(ClassA), create(ClassB))
実行結果
ClassA {} ClassB {}
ちなみに、次のどちらかの方法でインラインで宣言しても良い
function create<A>(a: new () => A): A {
return new a()
}
function create<A>(a: { new (): A }): A {
return new a()
}