TypeScript型別作為集合
阿新 • • 發佈:2021-10-21
型別作為集合
在 C# 或 Java 中,考慮執行時型別與其編譯時宣告之間的一一對應關係是有意義的。
在 TypeScript 中,最好將型別視為一組具有共同點的值。因為型別只是集合,一個特定的值可以同時屬於多個集合。
一旦您開始將型別視為集合,某些操作就會變得非常自然。例如,在C#中,這是尷尬繞過一個值,或者一個string
或int
,因為沒有一個單一的型別,表示這種價值。
在 TypeScript 中,一旦您意識到每種型別都只是一個集合,這就變得很自然了。您如何描述屬於string
集合或number
集合的值?它只是屬於這些集合的並集:string | number
。
TypeScript 提供了許多以集合論方式處理型別的機制,如果您將型別視為集合,您會發現它們更直觀。
擦除的結構型別
在 TypeScript 中,物件不是單一的精確型別。例如,如果我們構造一個滿足介面的物件,即使兩者之間沒有宣告關係,我們也可以在需要該介面的地方使用該物件。
interface Pointlike { x: number; y: number; } interface Named { name: string; } function logPoint(point: Pointlike) { console.log("x = " + point.x + ", y = " + point.y); } function logName(x: Named) { console.log("Hello, " + x.name); } const obj = { x: 0, y: 0, name: "Origin", }; logPoint(obj); logName(obj);TypeScript 的型別系統是結構性的,而不是名義上的:我們可以將其obj
用作 a,Pointlike
因為它的x
和y
屬性都是數字。型別之間的關係由它們包含的屬性決定,而不是它們是否以某種特定關係宣告。
TypeScript 的型別系統也沒有具體化:在執行時沒有任何東西可以告訴我們obj
是Pointlike
.事實上,該Pointlike
型別在執行時不以任何形式存在。
回到將型別作為集合的想法,我們可以將其obj
視為Pointlike
值Named
集和值集的成員。