((total, num) => total + num, 0)
sum.apply(null, [1, 2, 3])
7. strictFunctionTypes
该规则将检查并限制函数类型参数是抗变(
contravariantly
)而非双变(
bivariantly
,即协变或抗变)的。
初看,内心 OS:“这什么玩意儿?”,这里有篇介绍:
协变和逆变维基上写的很复杂,但是总结起来原理其实就一个。
说个最容易理解的例子,
int
和
float
两个类型的关系可以写成下面这样。
int
≦
float
:也就是说
int
是
float
的子类型。
这一更严格的检查应用于除方法或构造函数声明以外的所有函数类型。方法被专门排除在外是为了确保带泛型的类和接口(如 Array )总体上仍然保持协变。
请看下面这个
Animal
是
Dog
和
Cat
的父类型的例子:
declare let f1: (x: Animal) => void;
declare let f2: (x: Dog) => void;
declare let f3: (x: Cat) => void;
f1 = f2; // 启用 --strictFunctionTypes 时错误
f2 = f1; // 正确
f2 = f3; // 错误