目錄
交叉類型
編輯在類型理論中,交叉類型可以分配給那些既可以分配給類型的值一般來說,如果兩個類型的值的范圍重疊,那么屬于這兩個范圍的交點的值可以被賦予兩個類型的交點類型。例如,在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'的參數上面的程序代碼有
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/170746/