【发布时间】:2019-05-04 00:47:03
【问题描述】:
我正在努力定义如何编写 TypeScipt 代码,该代码表示该函数返回泛型类型的构造函数。关于如何传递泛型类型的构造函数,而不是如何返回的例子很多。
请检查以下示例:
这是抽象类的一部分:
getModel(): (new () => T) {
throw new Error('Method not implemented.'); // Error because don't know how to fix it
}
在派生类中,我尝试像这样实现它:
getModel(): typeof User {
return User;
}
我有以下错误:
Type '() => typeof User' is not assignable to type '() => new () => User'.
如果我知道如何在抽象类中指定,我可以跳过派生类中的实现。
所以问题是 - 如何在抽象类级别指定该方法返回泛型类型的构造函数,并且我可以在子级别类中跳过此方法的实现?或者我在抽象类级别上没有正确指定返回签名?
编辑:
请检查奇怪的问题。 A 类和 B 类的区别仅在于显式构造函数的存在。在 RealA 中不起作用,RealB 使用相同的 getModel() 方法。
class A {
a = '';
constructor(a: string) {
}
}
class B {
a = '';
static test(): void {
console.log('I do work');
}
}
abstract class Base<T> {
Prop: T;
constructor(TCreator: { new (): T; }) {
this.Prop = new TCreator();
}
getModel(): (new () => T) {
throw new Error('Method not implemented.'); // Error because don't know how to fix it
}
}
class RealA extends Base<A> {
getModel(): typeof A { // doesn't work - compilation error
return A;
}
}
class RealB extends Base<B> {
getModel(): typeof B { // works
return B;
}
}
var test = new RealA(A); // compile error
var test2 = new RealB(B)
对于 RealA 类同样的错误
() => typeof A' is not assignable to type '() => new () => A'
【问题讨论】:
-
您能否发布一个完整的示例。似乎适用于您提供的内容:typescriptlang.org/play/…
-
看起来您的
T是构造函数类型,而不是出于某种原因的实例类型。请注意User类型和User值不同,typeof User类型与User类型不同。您应该发布minimal reproducible example 以便有人准确指出问题。 -
@TitianCernicova-Dragomir 请检查最初的问题。我更新了。
-
不确定用例是什么,但作为旁注 - 您可以只在基类中使用
getModel() { return this.constructor; }而不是在每个派生类中实现它
标签: javascript typescript generics typescript-generics