Typescript中的通用方法

时间:2017-07-19 14:22:46

标签: typescript generics

我有一个抽象类,它有一个抽象的泛型方法,看起来像这样

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再次使我的代码符合要求?

3 个答案:

答案 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
}