在TypeScript中返回类(=类构造函数)的工厂函数

时间:2018-10-18 17:58:29

标签: typescript types

如果我在TypeScript中以以下方式定义一个类

class A {}

那么A既是值又是类型,所以我可以同时使用它:

type B = A
const C = A

如果A可能是花式类工厂函数的结果,则:

const A = fancyClassFactory(...someArgs)

那么A只是一个值,不是类型...

有没有办法使用这样的类工厂函数并获取类的类型?

非常感谢。

1 个答案:

答案 0 :(得分:2)

假设A是该类的构造函数,则可以使用InstanceType条件获取实例的类型:

const A = fancyClassFactory(...someArgs)
type A = InstanceType<typeof A>

对于特定示例@ daniel-hilgarth,您可以使用条件类型,因此返回类型根据传入的常量而有所不同:

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());
相关问题