TypeScript基礎入門 - 類型兼容性 - 泛型

轉發node

TypeScript基礎入門 - 類型兼容性 - 泛型

項目實踐倉庫git

https://github.com/durban89/typescript_demo.git
tag: 1.4.1

爲了保證後面的學習演示須要安裝下ts-node,這樣後面的每一個操做都能直接運行看到輸出的結果。github

npm install -D ts-node

後面本身在練習的時候能夠這樣使用typescript

npx ts-node 腳本路徑

泛型

由於TypeScript是結構性的類型系統,類型參數隻影響使用其作爲類型一部分的結果類型。好比,npm

interface Generics<T> {}

let g1: Generics<number> = <Generics<number>>{};
let g2: Generics<string> = <Generics<string>>{};

g1 = g2;

上面代碼裏,g1和g2是兼容的,由於它們的結構使用類型參數時並無什麼不一樣。 把這個例子改變一下,增長一個成員,就能看出是如何工做的了:學習

interface Generics<T> {
    data: T;
}

let g1: Generics<number> = <Generics<number>>{};
let g2: Generics<string> = <Generics<string>>{};

g1 = g2;

運行後會看到相似以下的輸出spa

$ npx ts-node src/type_compatibility_3.ts
⨯ Unable to compile TypeScript:
src/type_compatibility_3.ts(8,1): error TS2322: Type 'Generics<string>' is not assignable to type 'Generics<number>'.
  Type 'string' is not assignable to type 'number'.

在這裏,泛型類型在使用時就比如不是一個泛型類型。對於沒指定泛型類型的泛型參數時,會把全部泛型參數當成any比較。 而後用結果類型進行比較,以下例子。好比:code

let t1 = function<T>(x: T): T {
    // other ...
}

let t2 = function<U>(y: U): U {
    // other ...
}

t1 = t2


若是有個相似如上的代碼實例,是可否執行成功的,由於這裏(x: any): any == (y: any): anyblog

高級主題

子類型與賦值

目前爲止,咱們使用了兼容性,它在語言規範裏沒有定義。 在TypeScript裏,有兩種類型的兼容性:子類型與賦值。 它們的不一樣點在於,賦值擴展了子類型兼容,容許給 any賦值或從any取值和容許數字賦值給枚舉類型或枚舉類型賦值給數字。ip

語言裏的不一樣地方分別使用了它們之中的機制。 實際上,類型兼容性是由賦值兼容性來控制的,即便在implements和extends語句也不例外。 更多信息,請參閱 [TypeScript語言規範]


本實例結束實踐項目地址

https://github.com/durban89/typescript_demo.git
tag: 1.4.2
相關文章
相關標籤/搜索