Расширение универсального класса Typescript с помощью абстрактных методов - PullRequest
1 голос
/ 01 ноября 2019

Я пытаюсь расширить абстрактный обобщенный класс, но у меня возникают проблемы с расширением некоторых методов.

Учтите это:

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 голосов
/ 01 ноября 2019

Итак, обе функции в классе 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.

...