交叉类型

编辑
本词条由“匿名用户” 建档。

在类型理论中,交叉类型可以分配给那些既可以分配给类型的值一般来说,如果两个类型的值的范围重叠,那么属于这两个范围的交点的值可以被赋予两个类型的交点类型。例如,在Java中,布尔类同时实现了Serializable和Comparable接口。因此,一个布尔类型的对象可以被安全地传递给一个期望得到可序列化类型的参数的函数,以及一个期望得到可比较类型的参数的函数。交叉类型是复合数据类型。与产品类型类似,...

交叉类型

编辑

类型理论中,交叉类型可以分配给那些既可以分配给类型的值一般来说,如果两个类型的值的范围重叠,那么属于这两个范围的交点的值可以被赋予两个类型的交点类型。例如,在Java中,布尔类同时实现了Serializable和Comparable接口。因此,一个布尔类型的对象可以被安全地传递给一个期望得到可序列化类型的参数的函数,以及一个期望得到可比较类型的参数的函数。交叉类型是复合数据类型。与产品类型类似,它们被用来给一个对象分配几种类型。然而,产品类型被分配给图元,所以每个图元元素都被分配了一个特定的产品类型组件。相比之下,交叉类型的基础对象不一定是复合的。交叉类型的一个限制性形式是细化类型。交叉类型对于描述重载函数很有用。例如,如果number=>number是一个以数字为参数并返回数字的函数类型,string=>string是一个以字符串为参数并返回字符串的函数类型,那么这两种类型的交集可以用来描述(重载)函数,根据给定的输入类型,做一个或另一个。当代的编程语言,包括Ceylon、Flow、Java、Scala、TypeScript和Whiley(参见有交集类型的语言比较),都使用交集类型来组合接口规范和表达特殊的多态性。交叉类型是对参数化多态性的补充,可以用来避免跨重点类层次的污染,减少模板代码,正如下面TypeScript的例子所示。对交叉类型的类型学研究被称为交叉类型的学科。值得注意的是,程序终止可以用交叉类型学来精确描述。

TypeScript例子

编辑

TypeScript对交叉类型的支持提高了类型系统的表现力,减少了潜在类层次的大小,如下所示。下面的程序代码定义了类Chicken、Cow和RandomNumberGenerator,它们都有一个方法produce,返回Egg、Milk或number类型的对象。此外,函数eatEgg和drinkMilk分别接受鸡蛋和牛奶类型的参数。classEgg{privatekind:"Egg"}classMilk{privatekind:"Milk"}下面的程序代码定义了特设的多态函数animalToFood,它调用给定对象animal的成员函数produce。函数animalToFood有两个类型注释,((_:Chicken)=>Egg)和((_:Cow)=>Milk),由交叉类型构造函数&连接。

交点类型

具体来说,当animalToFood应用于鸡的参数时,将返回一个Egg类型的对象;当应用于牛的参数时,将返回一个Milk类型的对象。理想情况下,animalToFood不应该应用于任何具有(可能是意外的)生产方法的对象。//给定一只鸡,生产一个鸡蛋;给定一头牛,生产牛奶最后,下面的程序代码演示了上述定义的类型安全使用。console.log(eatEgg(animalToFood(chicken)));//我吃了一个鸡蛋。//console.log(eatEgg(animalToFood(cow)));//ERROR:Console.log(drinkMilk(animalToFood(cow)));//我喝了一些牛奶。类型为'Egg'的参数不能分配给类型为'Milk'的参数上面的程序代码有

内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/170746/

(1)
词条目录
  1. 交叉类型
  2. TypeScript例子

轻触这里

关闭目录

目录