当前位置: 首页 > 知识库问答 >
问题:

打字稿中的通用方法

邢博涛
2023-03-14

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

protected abstract getData<T>(): T[];

然后我有一个扩展这个抽象类的类。因为getData是抽象的,所以我必须在子类中实现它。

看起来像这样

protected getDataList<T>(): T[] {
    return this.databaseService().getSomethingList();
}

getSomethingList()返回Something[]

我得到以下错误虽然

类型'某物[]'不能分配给类型'T[]'。

我尝试了一些方法来解决这个错误,但是为了让Typescript满意,似乎还必须使子实现通用化。在我从2.2升级Typescript之前,上面的实现还不错。12.4。1

因此,我想知道如何使我的代码与TypeScript 2.4.1兼容?

共有3个答案

陆臻
2023-03-14

你也可以在你的类中使用这样的东西来定义某事[]:

interface Something{
    foo: foo,
    var: var
}
杨飞语
2023-03-14

您的实施:

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();
}
戴品
2023-03-14

我相信您正在尝试设置它,以便整个抽象基由派生实例必须具体化的特定类型参数化。以下是您将如何做到这一点:

abstract class Foo<T> {
    protected abstract getData(): T[];
}

class Something { }
class SomethingFoo extends Foo<Something> {
    protected getData(): Something[] {
        // implement here
    }
}

请注意,函数本身没有参数化,因为函数的调用方不是决定该函数将返回何种类型的人。相反,包含类型是参数化的,它的任何派生都指定相应的类型参数

 类似资料:
  • 我正在努力寻找 有什么不同?

  • 我试图在我的模型中添加一个静态方法,但是如果我这样做了,我得到了这个错误:< code >一个接口只能扩展一个类或另一个接口。 这是我的代码: 错误来自

  • 问题内容: 尝试在Typescript中实现Mongoose模型。对Google的调查只揭示了一种混合方法(结合JS和TS)。在没有JS的情况下,如何以我比较幼稚的方式实现User类呢? 希望能够不带行李的IUserModel。 问题答案: 这是我的方法:

  • 我正在typescript中创建一个类,该类的属性是ES6(ECMAscript 2016)映射,如下所示: 如何在打字稿中声明ES6 Map类型?

  • 我想实现这样的目标: 下面是我不想做的一个例子(我真的很讨厌JS中的重载黑客): 如何在TypeScript语言中做方法重载?

  • 我已经在我的.html文件中定义了这些: 然后在test.js: 但Typescript错误地指出:“找不到名称‘树’” 我也尝试编译与和放置在test.js文件的顶部,但它再次出错: