2016-10-25 13 views
1

私はBaseApiのサブクラスインスタンスを返すためのファクトリのような関数を持っています。これは、現在、このような何か(関係ない部分をトリミング)になります。`typeof T 'でのジェネリック型引数の使用

function getApi<T extends BaseApi>(apiClass: typeof BaseApi): T { 
    return new apiClass(); 
} 

をそして私はこのようにそれを使用します。

const someApi = getApi<SomeApi>(SomeApi); 

これは動作しますが、私は<SomeApi>は事実によって推測されたいですSomeApiコンストラクタを渡しています。<SomeApi>を省略した場合、someApiBaseApiではないと推測され、SomeApiではありません。さらに悪いことに、<T extends BaseApi>typeof BaseApiの間にはコンパイラの相関関係は全くないので、コンパイルエラーなしで間違ってgetApi<SecondApi>(FirstApi)のようなことをすることができます。

だから私はtypeof TとしてapiClassを定義しようとした:

function getApi<T extends BaseApi>(apiClass: typeof T): T { 
    return new apiClass(); 
} 

そして、私はTSがTのこの使用法を理解していなかったことがわかりました。これを行う方法はありますか?

答えて

4

引数をコンストラクタとして使用し、Tを生成するので、実際にはnew() => Tが必要です。たとえtypeof Tと書くことができても、それはあなたが望むものではないでしょう。Tには引数のないコンストラクタがないかもしれないからです。

typeofオペレータがをとり、を生成することを忘れないでください。 Tはすでにタイプです。値ではありません。

当然のことながら、これは活字体FAQに対処されhttps://github.com/Microsoft/TypeScript/wiki/FAQ#why-cant-i-write-typeof-t-new-t-or-instanceof-t-in-my-generic-function

+0

それくぎ付け、おかげでライアン! (あなたは文字どおり速く答えたので、まだ受け入れられません) – Aaron

+0

https://www.typescriptlang.org/docs/handbook/generics.html#using-class-types-in-generics –

関連する問題