协变与逆变
定义
协变指的是子类可以替换超类,用 S:<T
表示。
- 协变,子类型可以赋值给父类型,保持子类型关系,比如函数的返回值
- 逆变,父类型可以赋值给子类型,逆转子类型关系,比如函数的参数
我们可以理解为,子类更具体,是父类的超集,可以赋值给父类。
- 比如,一个函数的返回值,期待一个父类,此时如果返回一个子类,其中包含父类的所有信息,符合类型定义。
- 对于函数参数,以父类型做约束,如果将参数为子类型的函数赋值给参数是父类型的函数,该函数将期待比父类型更多的输入。此时传入父类型,不符合函数的预期,报错。此时继承关系逆转,子类做参数的函数不能赋值给父类做参数的函数类型,故为逆变。
TS默认参数双向协变,需要在 tsconfig中开启 strictFunctionType,方可支持参数逆变。