我有一个抽象类,它的子类继承了它。它还有一个静态函数,每个类包含一些硬编码数据。
我也有一个将字符串绑定到类B和C的类映射。当我尝试为该映射指定类型def时,将得到错误类型。
如果使用new () => A
,则不能使用静态方法。
如果使用typeof A
,则无法使用它创建新的类实例。
abstact class A {
static getSomeData(): string { return ''; }
abstract doSomething(): void { }
}
class B extends A {
getSomeData(): string { return 'hello' }
doSomething(): {}
}
class C extends A {
getSomeData(): string { return 'bye' }
doSomething(): {}
}
const classMap: { [id: string]: SOMETHING_HERE } = {
first: B,
second: C
}
///////
// Later
// I want to be able to both of these without TS complaining about types
classMap['first'].getSomeData();
new classMap['first']()
我需要做什么来指定类型?
简单的答案是typeof A & (new () => A)
。
但是我建议重新考虑您使用的模式:
尽管您可以在ES6 / Typescript中都可以做到,但我不建议这样做,因为任何阅读此代码的人都很难理解这种结构化类型与类多态性的奇异组合。这也是为什么键入此类内容非常棘手的原因(尽管仍然可行)。
为什么不使用具有甚至更简单类型的简单对象呢?
interface A {
getSomeData(): string;
createInstance(): {
doSomething(): void;
};
}
const B: A = {
getSomeData() {
return 'hello';
}
createInstance() {
return {
doSomething() {}
};
}
}
const C: A = {
getSomeData() {
return 'bye';
}
createInstance() {
return {
doSomething() {}
};
}
}
const classMap: { [id: string]: A } = {
first: B,
second: C
};
classMap['first'].getSomeData();
classMap['first'].createInstance();