TypeScriptの非抽象クラス(非抽象コンストラクター関数)の型シグネチャは次のとおりです。
declare type ConstructorFunction = new (...args: any[]) => any;
これはnewableタイプとも呼ばれます。ただし、abstractクラス(抽象コンストラクター関数)の型シグネチャが必要です。タイプFunction
を持つと定義できることは理解していますが、それはwayが広すぎます。より正確な代替手段はありませんか?
編集:
私が意味することを明確にするために、次の小さな断片は、抽象コンストラクターと非抽象コンストラクターの違いを示しています。
declare type ConstructorFunction = new (...args: any[]) => any;
abstract class Utilities {
...
}
var UtilityClass: ConstructorFunction = Utilities; // Error.
タイプ「typeof Utilities」は、タイプ「new(... args:any [])=> any」に割り当てることができません。
抽象コンストラクター型を非抽象コンストラクター型に割り当てることはできません。
私自身も同様の問題に苦労していましたが、これは私にとってはうまくいくようです:
type Constructor<T> = Function & { prototype: T }
同じ問題を抱えています。抽象クラスコンストラクターシグネチャの本質は、その宣言のabsense of new ( ... ) : X
thingyであると思います。それが明示的に宣言できる理由です。
しかしながら。これを行うと、コンパイルされます。
var UtilityClass: typeof Utilities = Utilities;
typeof Something
は、コンストラクター型を参照する良い方法ですが、拡張することはできません。
そして、いずれにしても、次のようなことができます:
var UtilityClass: ConstructorFunction = <any> Utilities;
抽象クラス(OO一般))の重要な点は、それらをインスタンス化できないことです。具体的な非抽象実装が必要です。
その抽象クラスに対して異なる実装を行い、それらの実装の1つを(パラメーターまたは類似のものとして)受信できるようにしたいと思います。
その場合は、おそらくこれで問題が解決する可能性があります。
declare type ConstructorFunction<T extends Utilities> = new (...args: any[]) => T;
abstract class Utilities { }
class MyUtilities extends Utilities { }
var UtilityClass: ConstructorFunction<MyUtilities> = MyUtilities;