如果我在TypeScript中以以下方式定义一个类
class A {}
那么A既是值又是类型,所以我可以同时使用它:
type B = A
const C = A
如果A可能是花式类工厂函数的结果,则:
const A = fancyClassFactory(...someArgs)
那么A只是一个值,不是类型...
有没有办法使用这样的类工厂函数并获取类的类型?
非常感谢。
答案 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());