ジェネリック関数を使用してクラスに対して静的メソッドを作成するにはどうすればよいですか?Generic関数を使用してTypeScriptクラスを動的に変更する
静的shouldMake
がtrueまたはfalseであるかどうかに応じて、一連のクラスに関数make
を追加したいとします。これらのmake
ファンクションは、ファクトリであり、クラスのインスタンスを作成する必要があります。
次のJavaScriptは動作します:
function makeMaker(cls)
{
if (cls.shouldMake)
cls.make = function(...args) { return new cls(...args); };
return cls;
}
あなたはこのを通じてクラスのセットを実行することができます。
outClasses = inClasses.map(makeMaker);
私は活字体で動作するように、このような何かを期待する:
function makeMaker<T>(cls: T): T
{
if (cls.shouldMake)
cls.make = function(...args: any[]) { return new cls(...args); }
return cls;
}
ただし、これによりエラーが発生します:
プロパティ 'shouldMake'がタイプ 'T'に存在しません。
と
プロパティ 'make' を型 'T' に存在しません
。
と
は、そのタイプのコールまたは構築署名を欠いた表現で「新しい」を使用することはできません。この場合
、cls
は、型Tの値を推測するであろう。あなたが引数(cls
)としてクラスを「クラスの型」のようなものにすると、Tを期待できます。コンストラクタコンストラクタにそれを変更する:
function makeMaker<T>(cls: { new(...args: any[]): T })
{
if (cls.shouldMake)
cls.make = function(...args: any[]) { return new cls(...args); };
return cls;
}
原因:
プロパティ 'shouldMakeは、' タイプ ':=> T新しい(任意の[] ...引数)' に存在しません。
と
プロパティ 'make' を型 '新しい(... argsを:任意の[])=> T' に存在しません。
これは意味がありますが、makeMaker
が呼び出されない場合でもこのエラーが発生します。したがって、Tのコンストラクタ(Tクラス自体)がshouldMake
とmake
プロパティが有効な型であることを保証する必要があります。
どうすればよいですか?基本的には、どのようにクラスをタイプにするかは、これを制限できるインターフェイスから継承するか、有効なstaticプロパティをクラスでどのように記述しますか?これは、https://github.com/Microsoft/TypeScript/issues/13462とhttps://github.com/Microsoft/TypeScript/issues/14600に応じてサポートされていないようです。このロジックに応じてJavaScriptコードベースが大きくなると、TypeScriptに変換できなくなります(多少の完全な書き換えは除外されます)。