Demon __ Asked:2022-04-28 04:43:55 +0800 CST2022-04-28 04:43:55 +0800 CST 2022-04-28 04:43:55 +0800 CST 逆变函数是什么意思 772 打字稿文档 在 strictFunctionTypes 下,函数类型参数位置以逆变方式而不是双变量方式进行检查。有关方差对函数类型意味着什么的背景知识,请查看什么是协方差和逆变?。 我也读过这个,但不明白什么是逆变? javascript 1 个回答 Voted Best Answer Gleb Kemarsky 2022-04-28T21:09:31+08:002022-04-28T21:09:31+08:00 泛型接口的协变和逆变: 协变和逆变的概念与在应用程序中使用的能力有关,而不是某种类型,而是在继承层次结构中较低或较高的另一种类型。 协方差允许您使用比最初指定的类型更具体的类型。 逆变允许您使用比最初指定的更通用的类型。 因此,如果我们创建一个数据类型животные及其子类型собакиor кошки,那么在我们的函数类型中,不同的参数将对另一种类型的值做出不同的反应: covariant ( covariant ) 允许您转移给他собак或кошек代替животных最初分配的那些; 逆变将接受животных而不是,собак但反之亦然; bivariant ( bivariant ) 将允许两种选择; invariant不允许替换,只允许指定的数据类型。 通常,打字稿中的参数将允许不变性,而 costrictFunctionTypes参数将需要逆变性。因此,例如: type Animal = 'cat1' | 'cat2' | 'dog1' | 'dog2' | 'elephant1' | 'elephant2'; type Dog = 'dog1' | 'dog2'; declare let f1: (x: Animal) => void; declare let f2: (x: Dog) => void; 那么这两个分配对于普通参数(沙箱)都是有效的: f1 = f2; // Ok without --strictFunctionTypes f2 = f1; // Ok 和 costrictFunctionTypes第一个将导致错误消息(沙箱): f1 = f2; // Error with --strictFunctionTypes f2 = f1; // Ok 如果我们添加第三个子类型 type Cat = 'cat1' | 'cat2'; declare let f3: (x: Cat) => void; 那么第三个赋值在这两种情况下都会导致错误 - 无论有strictFunctionTypes没有它: f2 = f3; // Error 接口 对于接口来说,重要的是它们之间是否存在结构上的差异,仅仅继承这一事实是不够的。 类型兼容性: TypeScript 的结构化类型系统是根据 JavaScript 代码的典型编写方式设计的。因为 JavaScript 广泛使用匿名对象,如函数表达式和对象字面量,所以用结构化类型系统而不是名义上的类型系统来表示 JavaScript 库中发现的各种关系要自然得多。 此代码不会显示错误(沙箱): interface Animal{} interface Dog extends Animal{} interface Cat extends Animal{} declare let f1: (x: Animal) => void; declare let f2: (x: Dog) => void; declare let f3: (x: Cat) => void; f1 = f2; f2 = f1; f2 = f3; 但是在此代码中,如果在设置中启用此选项,则会出现一个错误或strictFunctionTypes两个错误: interface Animal{} interface Dog extends Animal{ breed: string; } interface Cat extends Animal{ name: string; } declare let f1: (x: Animal) => void; declare let f2: (x: Dog) => void; declare let f3: (x: Cat) => void; f1 = f2; // Error with --strictFunctionTypes f2 = f1; // Ok f2 = f3; // Error 和错误文本: “动物”类型不能分配给“狗”类型。
泛型接口的协变和逆变:
因此,如果我们创建一个数据类型
животные
及其子类型собаки
orкошки
,那么在我们的函数类型中,不同的参数将对另一种类型的值做出不同的反应:собак
或кошек
代替животных
最初分配的那些;животных
而不是,собак
但反之亦然;通常,打字稿中的参数将允许不变性,而 co
strictFunctionTypes
参数将需要逆变性。因此,例如:那么这两个分配对于普通参数(沙箱)都是有效的:
和 co
strictFunctionTypes
第一个将导致错误消息(沙箱):如果我们添加第三个子类型
那么第三个赋值在这两种情况下都会导致错误 - 无论有
strictFunctionTypes
没有它:接口
对于接口来说,重要的是它们之间是否存在结构上的差异,仅仅继承这一事实是不够的。
类型兼容性:
此代码不会显示错误(沙箱):
但是在此代码中,如果在设置中启用此选项,则会出现一个错误或
strictFunctionTypes
两个错误:和错误文本: