Расширение универсального класса Typescript с помощью абстрактных методов

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

Учти это:

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 '{}'.

Машинопись площадка Link


person Ivan V.    schedule 01.11.2019    source источник


Ответы (1)


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

}

площадка Link

Вот что не так в вашей попытке:

upload не может вернуть string, потому что тип возврата должен быть S, который является универсальным параметром функции. Поскольку это общий параметр функции, он будет указан при вызове функции, поэтому, хотя вы объявляете его в своем классе, он по-прежнему является общим, а не конкретным. Значит, его подпись должна быть protected upload<S>(item: T): S

upload не может вернуть string, поскольку предполагается, что возвращаемый тип - K, который является универсальным параметром класса. Поскольку это общий параметр класса, он будет указан при создании экземпляра класса. Итак, когда вы определяете класс, он по-прежнему является универсальным. Значит, его подпись должна быть protected download(item: T): K.

person Kewin Dousse    schedule 01.11.2019
comment
Итак, как бы вы реализовали эти методы? - person Ivan V.; 01.11.2019
comment
Похоже, что я не могу реализовать их в классе B, поскольку он также является универсальным? Я явно что-то не так делаю. - person Ivan V.; 01.11.2019
comment
В последнем абзаце должно быть написано, что download не может вернуться ... однако. - person altocumulus; 06.11.2019