TypeScript基礎入門
阿新 • • 發佈:2018-12-09
轉發
專案實踐倉庫
為了保證後面的學習演示需要安裝下ts-node,這樣後面的每個操作都能直接執行看到輸出的結果。
npm install -D ts-node
後面自己在練習的時候可以這樣使用
npx ts-node 指令碼路徑
泛型
因為TypeScript是結構性的型別系統,型別引數隻影響使用其做為型別一部分的結果型別。比如,
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;
執行後會看到類似如下的輸出
$ 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比較。 然後用結果型別進行比較,如下例子。比如:
let t1 = function<T>(x: T): T {
// other ...
}
let t2 = function<U>(y: U): U {
// other ...
}
t1 = t2
如果有個類似如上的程式碼例項,是能否執行成功的,因為這裡(x: any): any == (y: any): any
高階主題
子型別與賦值
目前為止,我們使用了相容性,它在語言規範裡沒有定義。 在TypeScript裡,有兩種型別的相容性:子型別與賦值。 它們的不同點在於,賦值擴充套件了子型別相容,允許給 any賦值或從any取值和允許數字賦值給列舉型別或列舉型別賦值給數字。
語言裡的不同地方分別使用了它們之中的機制。 實際上,型別相容性是由賦值相容性來控制的,即使在implements和extends語句也不例外。 更多資訊,請參閱 [TypeScript語言規範]
本例項結束實踐專案地址