typescript結構化型別系統的基本規則是,如果x要相容y,那麼y至少具有與x相同的屬性。比如:
inte***ce
named
let x: named;
// y's inferred type is
let y =
;x = y;
這裡要檢查y是否能賦值給x,編譯器檢查x中的每個屬性,看是否能在y中也找到對應屬性。 在這個例子中,y必須包含名字是name的string型別成員。y滿足條件,因此賦值正確。
檢查函式引數時使用相同的規則:
function
greet
(n: named)
greet
(y);
// ok
注意,y有個額外的location屬性,但這不會引發錯誤。 只有目標型別(這裡是named)的成員會被一一檢查是否相容。
這個比較過程是遞迴進行的,檢查每個成員及子成員。
列舉型別與數字型別相容,並且數字型別與列舉型別相容。不同列舉型別之間是不相容的。比如,
enum status
;enum color
;let status = status.ready;
status = color.green;
// error
類與物件字面量和介面差不多,但有一點不同:類有靜態部分和例項部分的型別。 比較兩個類型別的物件時,只有例項的成員會被比較。 靜態成員和建構函式不在比較的範圍內。
class
animal
}class
size
}let a: animal;
let s: size;
a = s;
// ok
s = a;
// ok
類的私有成員和受保護成員會影響相容性。 當檢查類例項的相容時,如果目標型別包含乙個私有成員,那麼源型別必須包含來自同乙個類的這個私有成員。 同樣地,這條規則也適用於包含受保護成員例項的型別檢查。 這允許子類賦值給父類,但是不能賦值給其它有同樣型別的類。
因為typescript是結構性的型別系統,型別引數只影響使用其做為型別一部分的結果型別。比如,
inte***ce
empty
<
t>
let x: empty
;let y: empty
;x = y;
// ok, because y matches structure of x
上面**裡,x和y是相容的,因為它們的結構使用型別引數時並沒有什麼不同。 把這個例子改變一下,增加乙個成員,就能看出是如何工作的了:
inte***ce
notempty
<
t>
let x: notempty
;let y: notempty
;x = y;
// error, because x and y are not compatible
在這裡,泛型型別在使用時就好比不是乙個泛型型別。
對於沒指定泛型型別的泛型引數時,會把所有泛型引數當成any比較。 然後用結果型別進行比較,就像上面第乙個例子。
比如,
let
identity
=function
<
t>
(x:t):
tlet
reverse
=function
<
u>
(y:u):
uidentity = reverse;
// ok, because (x: any) => any matches (y: any) => any
TypeScript 基礎型別
基礎型別可以依據是否含有型別關鍵字分為兩類 注意 所有型別關鍵字都是小寫的。注 這種分類並不嚴謹,分類的目的僅僅用於幫助記憶型別用來指定變數的型別,相容的型別之間才能進行賦值 傳參等操作。宣告變數型別使用變數名 型別格式,如let decimal number 10,宣告之後decimal就只能接受...
typescript 索引型別
1.索引型別 let obj function getkey obj any keys string 指定所包含的屬性 console.log getkey obj,a b 放入不包含的屬性,正常情況我們希望這種要報錯 console.log getkey obj,c f 1.2 接下來學習幾種方法...
typescript 內建型別
ts關鍵字 ts 內建型別 partial 將內建屬性邊可選 required 將型別屬性邊必選 pick 從某個型別中挑出一些屬性 record mutable 將型別的屬性邊城可修改 readonly 型別的屬性變唯讀 returntype 用來得到乙個函式的返回值型別 的作用是斷言某個變數不會...