轉(zhuǎn)發(fā)
TypeScript基礎(chǔ)入門 - 類型兼容性 - 泛型
項(xiàng)目實(shí)踐倉庫
https://github.com/durban89/typescript_demo.git
tag: 1.4.1
為了保證后面的學(xué)習(xí)演示需要安裝下ts-node,這樣后面的每個操作都能直接運(yùn)行看到輸出的結(jié)果。
npm install -D ts-node
后面自己在練習(xí)的時候可以這樣使用
npx ts-node 腳本路徑
泛型
因?yàn)門ypeScript是結(jié)構(gòu)性的類型系統(tǒng),類型參數(shù)只影響使用其做為類型一部分的結(jié)果類型。比如,
interface Generics<T> {}
let g1: Generics<number> = <Generics<number>>{};
let g2: Generics<string> = <Generics<string>>{};
g1 = g2;
上面代碼里,g1和g2是兼容的,因?yàn)樗鼈兊慕Y(jié)構(gòu)使用類型參數(shù)時并沒有什么不同。 把這個例子改變一下,增加一個成員,就能看出是如何工作的了:
interface Generics<T> {
data: T;
}
let g1: Generics<number> = <Generics<number>>{};
let g2: Generics<string> = <Generics<string>>{};
g1 = g2;
運(yùn)行后會看到類似如下的輸出
$ 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'.
在這里,泛型類型在使用時就好比不是一個泛型類型。對于沒指定泛型類型的泛型參數(shù)時,會把所有泛型參數(shù)當(dāng)成any比較。 然后用結(jié)果類型進(jìn)行比較,如下例子。比如:
let t1 = function<T>(x: T): T {
// other ...
}
let t2 = function<U>(y: U): U {
// other ...
}
t1 = t2
如果有個類似如上的代碼實(shí)例,是能否執(zhí)行成功的,因?yàn)檫@里<kbd style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(255, 255, 255); background-color: rgb(51, 51, 51); border-radius: 3px; box-shadow: rgba(0, 0, 0, 0.25) 0px -1px 0px inset;">(x: any): any == (y: any): any</kbd>
高級主題
子類型與賦值
目前為止,我們使用了兼容性,它在語言規(guī)范里沒有定義。 在TypeScript里,有兩種類型的兼容性:子類型與賦值。 它們的不同點(diǎn)在于,賦值擴(kuò)展了子類型兼容,允許給 any賦值或從any取值和允許數(shù)字賦值給枚舉類型或枚舉類型賦值給數(shù)字。
語言里的不同地方分別使用了它們之中的機(jī)制。 實(shí)際上,類型兼容性是由賦值兼容性來控制的,即使在implements和extends語句也不例外。 更多信息,請參閱 [TypeScript語言規(guī)范]
本實(shí)例結(jié)束實(shí)踐項(xiàng)目地址
https://github.com/durban89/typescript_demo.git
tag: 1.4.2