Подкласс Typescript принимается как значение типа суперкласса, но не как параметр функции, которая принимает тип суперкласса - PullRequest
0 голосов
/ 14 апреля 2020
class Parent {
  str = 'a';
}
class ParentExtended extends Parent {
  num = 1;
}
class MyClass {
  static property?: Parent
  static method (p: Parent): void {}
  static func?: (pParam: Parent) => void
}
const pe: ParentExtended = {
  str: '',
  num: 1
}
// OK
MyClass.property = pe
// OK
MyClass.method(pe)
// Error
MyClass.func = (p: ParentExtended) => {}
Type '(p: ParentExtended) => void' is not assignable to type '(p: Parent) => void'.
  Types of parameters 'p' and 'pParam' are incompatible.
    Property 'num' is missing in type 'Parent' but required in type 'ParentExtended'.ts(2322)

Здесь мой расширенный класс принимается как поле stati c и как аргумент метода.

Но когда я присваиваю MyClass.func (тип аргумента которого является child ParentExtended) функция с типом аргумента Parent, TS говорит, что параметры несовместимы. Почему это происходит? Как бы я позволил ему принять функцию, которая принимает дочерний класс (желательно без обобщений)?

Заранее спасибо

1 Ответ

0 голосов
/ 14 апреля 2020

Вы пытаетесь присвоить функции func, объявленной как (pParam: Parent) => void, функцию, которая будет объявлена ​​как (p: ParentExtended) => void.
Поскольку ParentExtended не является суперклассом Parent, он не работает.
Вы не можете гарантировать, что каждый объект, унаследовавший поведение Parent, также наследует класс ParentExtended.
Простой пример:

class A {}
class B extends A {}
class C extends A {}

function test(obj: A) {}

В функции test вы можете передавать объекты типа B, C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...