使用抽象方法扩展Typescript泛型类

时间:2019-11-01 00:15:46

标签: typescript typescript-generics

我正在尝试扩展抽象泛型类,但是在扩展某些方法时遇到了困难。

考虑一下:

abstract class A<T,K> {

    protected abstract upload<S>(item: T): S
    protected abstract download(item: T): K

}

class B<T, K > extends A<T, K>{

    protected upload(item: T):string {
        return 'hello'
    }
    protected download(item: T): number{
        return 1

    }

}

我在类upload中为B方法得到的错误是:

Property 'upload' in type 'B<T, K>' is not assignable to the same property in base type 'A<T, K>'.
  Type '(item: T) => string' is not assignable to type '<S>(item: T) => S'.
    Type 'string' is not assignable to type 'S'.

对于类download中的B方法:

Property 'download' in type 'B<T, K>' is not assignable to the same property in base type 'A<T, K>'.
  Type '(item: T) => number' is not assignable to type '(item: T) => K'.
    Type 'number' is not assignable to type 'K'.
      'number' is assignable to the constraint of type 'K', but 'K' could be instantiated with a different subtype of constraint '{}'.

Typescript Playground Link

1 个答案:

答案 0 :(得分:0)

因此,此处的B类中的两个函数都包含您不能执行的操作。

我不知道您的最终代码将是什么样,但是这可能类似于:

abstract class A<T,K> {

    protected abstract upload<S>(item: T): S
    protected abstract download(item: T): K

}

class B<T, K > extends A<T, K>{

    protected upload<S>(item: T): S {
        // return something of type S
    }

    protected download(item: T): K {
        // return something of type K
    }

}

Playground Link

这是您尝试中出现的问题:

upload无法返回string,因为返回类型应该是S,它是函数的通用参数。因为它是函数的通用参数,所以将在函数调用时指定它,因此,当您在类中声明它时,它仍然是通用的,而不是特定的。因此其签名必须为protected upload<S>(item: T): S

upload无法返回string,因为返回类型应该为K,它是 class 的通用参数。由于它是类的通用参数,因此将在类实例化中指定。因此,当您定义类时,它仍然是通用的。因此其签名必须为protected download(item: T): K