轉發node
項目實踐倉庫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