ウェブサイト検索

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());

関連記事