types - TypeScriptでクラス(=クラスコンストラクタ)を返すファクトリ関数
もし私がTypeScriptで次のようにクラスを定義した場合
class A {}
それでは A は値でも型でもあるので、両方の方法で使うことができます:
type B = A
const C = A
もしAが代わりに高度なクラスファクトリー関数の結果であった場合:
const A = fancyClassFactory(...someArgs)
それでは A は値に過ぎず、型ではありません…
そのようなクラスファクトリー関数を使用して、クラスの型も取得する方法はありますか?
前もってどうもありがとうございます。
回答 #1
クラスのコンストラクタが A だと仮定すると、インスタンスの型を取得するために InstanceType 条件型を使用できます:
const A = fancyClassFactory(...someArgs)
type A = InstanceType<typeof A>
ダニエル・ヒルガルトが提供した具体的な例については、条件付き型を使用して、渡された定数に応じて戻り値の型を変えることができます。
function fancyClassFactory<T extends 'a' | 'b'>(what: T) : (T extends 'a' ? typeof fancyClassFactory.A: typeof fancyClassFactory.B)
function fancyClassFactory(what: string) {
if (what === 'a') {
return fancyClassFactory.A
}
if (what === 'b') {
return fancyClassFactory.B
}
}
namespace fancyClassFactory {
export class A {
foo() { return 'barA'; }
}
export class B {
bar() { return 'fooB'; }
}
}
const A = fancyClassFactory('a');
const B = fancyClassFactory('b');
type TA = InstanceType<typeof A>;
function generic<T>(t: T) {
console.log(t);
}
generic<TA>(new A());
generic<TA>(new B());
