TypeScript型別系統基本規則

2021-10-10 10:26:37 字數 1926 閱讀 4655

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 用來得到乙個函式的返回值型別 的作用是斷言某個變數不會...