TypeScript基礎(chǔ)入門 - 類型兼容性 - 泛型

轉(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • TypeScript 是 JavaScript 的一個超集,主要提供了類型系統(tǒng)和對 ES6 的支持,它由 Micr...
    Gukson666閱讀 8,908評論 3 29
  • 類型兼容 如果,我們定義一個包含屬性name的對象要: 這樣我們定義obj的時候就只能并且必須使obj有一個nam...
    Dabao123閱讀 1,876評論 0 3
  • 概述 TypeScript本質(zhì)上是向JavaScript語言添加了可選的靜態(tài)類型和基于類的面向?qū)ο缶幊?,同時也支持...
    oWSQo閱讀 8,683評論 1 45
  • 前言 人生苦多,快來 Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,703評論 9 118
  • "Unterminated string literal.": "未終止的字符串文本。", "Identifier...
    兩個心閱讀 8,559評論 0 4

友情鏈接更多精彩內(nèi)容