【发布时间】:2021-07-03 02:52:20
【问题描述】:
假设我有一个通用抽象基类和一组扩展基类并提供通用参数的类。
abstract class BaseClass<T> {
constructor(protected container: T[]) { }
static someStaticFunc(): string {
return 'I\'m the BaseClass';
}
getElement(i: number): T {
return this.container[i]
}
}
class ConcreteClass1 extends BaseClass<number> {
static someStaticFunc(): string {
return 'I\'m ConcreteClass1'
}
addNumber(element: number) {
this.container.push(element);
}
}
class ConcreteClass2 extends BaseClass<string> {
static someStaticFunc(): string {
return 'I\'m ConcreteClass2'
}
addStringTwice(element: string) {
this.container.push(element);
this.container.push(element);
}
}
class ConcreteClass3 extends BaseClass<boolean> {
// Doesn't add anything
}
我定义了一个接口结构,其中每个值都必须是typeof BaseClass
interface SetOfBaseClasses {
Class1: typeof BaseClass,
Class2: typeof BaseClass,
Class3: typeof BaseClass
};
我想创建一个该接口类型的对象,并将具体的类分配给它。然后调用类上的每一个静态函数,在底部得到预期的结果。
const classes: SetOfBaseClasses = {
Class1: ConcreteClass1,
Class2: ConcreteClass2,
Class3: ConcreteClass3
}
console.log(classes.Class1.someStaticFunc());
console.log(classes.Class2.someStaticFunc());
console.log(classes.Class3.someStaticFunc());
// Expected output:
// I'm ConcreteClass1
// I'm ConcreteClass2
// I'm the BaseClass
但是,TypeScript 不认为 ConcreteClass1、ConcreteClass2 或 ConcreteClass3 与 typeof BaseClass 兼容。我认为这是因为 BaseClass 涉及的泛型。所以我也尝试了:
interface SetOfBaseClasses {
Class1: typeof BaseClass<unknown>,
Class2: typeof BaseClass<unknown>,
Class3: typeof BaseClass<unknown>
};
更准确地说:
interface SetOfBaseClasses {
Class1: typeof BaseClass<number>,
Class2: typeof BaseClass<string>,
Class3: typeof BaseClass<boolean>
};
在任何一种情况下,TypeScript 似乎都不允许在 typeof Class 之后使用泛型参数
界面中的每一行都有两个错误,如下所示:
Call signature, which lacks return-type annotation, implicitly has an 'any' return type.(7020)
Type parameter name cannot be 'number'.(2368)
有没有办法用 TypeScript 做这种事情?在涉及泛型之前,这种方法似乎一切正常。
【问题讨论】:
标签: typescript typescript-generics