web-dev-qa-db-ja.com

TypeScriptの抽象コンストラクター型

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」に割り当てることができません。

抽象コンストラクター型を非抽象コンストラクター型に割り当てることはできません。

25
John Weisz

私自身も同様の問題に苦労していましたが、これは私にとってはうまくいくようです:

type Constructor<T> = Function & { prototype: T }
28
Tehau Cave

同じ問題を抱えています。抽象クラスコンストラクターシグネチャの本質は、その宣言のabsense of new ( ... ) : X thingyであると思います。それが明示的に宣言できる理由です。

しかしながら。これを行うと、コンパイルされます。

var UtilityClass: typeof Utilities  = Utilities;

typeof Somethingは、コンストラクター型を参照する良い方法ですが、拡張することはできません。

そして、いずれにしても、次のようなことができます:

var UtilityClass: ConstructorFunction = <any> Utilities;
3
gaperton

抽象クラス(OO一般))の重要な点は、それらをインスタンス化できないことです。具体的な非抽象実装が必要です。

その抽象クラスに対して異なる実装を行い、それらの実装の1つを(パラメーターまたは類似のものとして)受信できるようにしたいと思います。
その場合は、おそらくこれで問題が解決する可能性があります。

declare type ConstructorFunction<T extends Utilities> = new (...args: any[]) => T;

abstract class Utilities { }

class MyUtilities extends Utilities { }

var UtilityClass: ConstructorFunction<MyUtilities> = MyUtilities; 
0
Nitzan Tomer