Typescript子类被接受为超类类型的值,但不作为接受超类类型的函数的参数

时间:2020-04-14 19:27:50

标签: javascript node.js typescript oop

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)

在这里,我的扩展类被接受为静态字段和方法的参数。

但是当我给MyClass.func(其参数类型是子ParentExtended)分配一个参数类型为Parent的函数时,TS表示参数不兼容。为什么会这样?我将如何允许它接受接受子类的函数(最好是没有泛型的子类)?

预先感谢

1 个答案:

答案 0 :(得分:0)

您正在尝试将声明为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中,您可以传递类型为BC的对象。