代码中我们定义了三个类型,他们之间的子集关系为 Corgi <: Dog <: Animal。

返回值类型很容易理解:柯基是狗的子类型。但参数类型则是相反的:动物是狗的父类。 用合适的术语来描述这个奇怪的表现,可以说我们允许一个函数类型中,返回值类型是协变的,而参数类型是逆变的。 一个有趣的现象:在 TypeScript 中, 参数类型是双向协变的 (opens new window) ,也就是说既是协变又是逆变的,而这并不安全。但是现在你可以在 TypeScript 2.6 (opens new window) 版本中通过 --strictFunctionTypes 或 --strict 标记来修复这个问题。