1. 程式人生 > >TypeScript基礎入門

TypeScript基礎入門

轉發

專案實踐倉庫

為了保證後面的學習演示需要安裝下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語言規範]

本例項結束實踐專案地址