Итак, обе функции в классе 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
, который является универсальным параметром класса . Поскольку это универсальный параметр класса, он будет указан в экземпляре класса . Поэтому, когда вы определяете класс, он все еще является общим. Так что его подпись должна быть protected download(item: T): K
.