我正在尝试扩展抽象泛型类,但是在扩展某些方法时遇到了困难。
考虑一下:
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 '{}'.
答案 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
}
}
这是您尝试中出现的问题:
upload
无法返回string
,因为返回类型应该是S
,它是函数的通用参数。因为它是函数的通用参数,所以将在函数调用时指定它,因此,当您在类中声明它时,它仍然是通用的,而不是特定的。因此其签名必须为protected upload<S>(item: T): S
upload
无法返回string
,因为返回类型应该为K
,它是 class 的通用参数。由于它是类的通用参数,因此将在类实例化中指定。因此,当您定义类时,它仍然是通用的。因此其签名必须为protected download(item: T): K
。