我有一个抽象类,它有一个抽象的泛型方法,看起来像这样
protected abstract getData<T>(): T[];
然后我有一个扩展这个抽象类的类。由于getData
是抽象的,我必须在子类中实现它。
它看起来像这样
protected getDataList<T>(): T[] {
return this.databaseService().getSomethingList();
}
getSomethingList()
返回Something[]
我收到了以下错误
类型'Something []'不能分配给'T []'。
我尝试了很少的东西来解决这个错误,但似乎必须使子实现也是通用的,以使Typescript感到高兴。在将Typescript从2.2.1
升级到2.4.1
之前,上述实现很好。
所以我想知道如何使用Typescript 2.4.1再次使我的代码符合要求?
答案 0 :(得分:3)
我相信你正在尝试设置它,以便整个抽象基础由派生实例必须实现的特定类型进行参数化。以下是您将如何做到这一点:
abstract class Foo<T> {
protected abstract getData(): T[];
}
class Something { }
class SomethingFoo extends Foo<Something> {
protected getData(): Something[] {
// implement here
}
}
请注意,函数本身没有参数化,因为函数的调用者不是决定此函数将返回什么类型的函数。相反,包含类型是参数化的,并且它的任何派生都指定相应的类型参数。
答案 1 :(得分:1)
您的实施:
protected getDataList<T>(): T[] {
return this.databaseService().getSomethingList();
}
错误的是T
没有以任何方式取代。这称为无用的通用 https://basarat.gitbooks.io/typescript/docs/types/generics.html
protected getDataList(): Something[] {
return this.databaseService().getSomethingList();
}
答案 2 :(得分:0)
你也可以使用类似的东西来定义Something []:
interface Something{
foo: foo,
var: var
}