28對(duì)聲明合并的愛與恨_第1頁(yè)
28對(duì)聲明合并的愛與恨_第2頁(yè)
28對(duì)聲明合并的愛與恨_第3頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 零基礎(chǔ)學(xué)透 ypeScr pt / 4 3 對(duì) 合并的愛與恨對(duì) 合并的愛與恨更新時(shí)間 2019 07 12 09:24:27理想的書籍是智慧的鑰匙。合并是指 TypeScr pt 編譯器會(huì)將名字相同的多個(gè) 合并為一個(gè) ,合并后的 同時(shí)擁有多個(gè) 的特性。我們知道在 JavaScr p 中,使用var關(guān)鍵字定義變量時(shí),定義相同名字的變量,后面的會(huì)覆蓋前面的值。使用et 定義變量和使用 const 定義常量時(shí),不 名字重復(fù)。在 TypeScr pt 中,接 、命名空間是可以多次 的,最后TypeScr pt 會(huì)將多個(gè)同名 合并為一個(gè)。我們下來(lái)看個(gè)簡(jiǎn)單的例子:interface nfo name s

2、tringinterface nfo age numberlet info nfoinfo = / error 類型“ name string ”中缺少屬性“age” name 'lison'info = / right name 'lison' age 18可以看到,我們定義了兩個(gè)同名接 Info,每個(gè)接 里都定義了一個(gè)必備屬性,最后定義nfo類型為Info時(shí), nfo的定義要求同時(shí)包含name和age屬性。這就是 合并的簡(jiǎn)單示例,接下來(lái)我們?cè)敿?xì)學(xué)習(xí)。4.3.1. 補(bǔ)充知識(shí)TypeScr pt的所有 概括起來(lái),會(huì)創(chuàng)建這三種實(shí)體之一:命名空間、類型和值:命名空間

3、的創(chuàng)建實(shí)際是創(chuàng)建一個(gè)對(duì)象,對(duì)象的屬性是在命名空間里export導(dǎo)出的內(nèi)容;類型的 是創(chuàng)建一個(gè)類型并賦給一個(gè)名字;值的 就是創(chuàng)建一個(gè)在JavaScr pt中可以使用的值。下面這個(gè)表格會(huì)清晰的告訴你,每一種 類型會(huì)創(chuàng)建這三種實(shí)體中的哪種,先來(lái)說(shuō)明一下,第一列是指 的內(nèi)容,每一行包含4列,表明這一行中,第一列的 類型創(chuàng)建了后面三列哪種實(shí)體,打鉤即表示創(chuàng)建了該實(shí)體:類型創(chuàng)建了命名空間創(chuàng)建了類型創(chuàng)建了值NamespaceClassEnumnterfaceType Alias類型別名FunctionVariable可以看到,只 名空間創(chuàng)建了命名空間這種實(shí)體。C ass、Enum兩個(gè),C ass即是實(shí)際的值

4、也作為類使用,Enum 編譯為JavaScr pt后也是實(shí)際值,而且我們講過(guò),一定條件下,它的成員可以作為類型使用;Interface和類型別名 是純粹的類型;而Func ton和Var ab e只是創(chuàng)建了JavaScr pt中可用的值,不能作為類型使用,注意這里Var ab e是變量,不是常量,常量是可以作為類型使用的。4.3.2. 合并接口我們?cè)诒竟?jié)課一開始的例子中,簡(jiǎn)單示范了一下接 的合并,下面我們來(lái)補(bǔ)充一些內(nèi)容。多個(gè)同名接 ,定義的非函數(shù)的成員命名應(yīng)該是不重復(fù)的,如果重復(fù)了,類型應(yīng)該是相同的,否則將會(huì)報(bào)錯(cuò)。interface nfo name stringinterface nfo a

5、ge numberinterface nfo age boolean / error 后續(xù)屬性 必須屬于同 類型 屬性“age”的類型必須為“number”,但此處卻為類型“boolean”對(duì)于函數(shù)成員,每個(gè)同名函數(shù)成員都會(huì)被當(dāng)成這個(gè)函數(shù)的重載,且合并時(shí)后面的接 具有更高的優(yōu)先級(jí)。來(lái)看下多個(gè)同名函數(shù)成員的例子:interface Res getRes(input string) numberinterface Res getRes(input number) stringconst res Res = getRes (input any) any => if (typeof input

6、= 'string') return input length else return String(input)res getRes('123') length / error 類型“number” 不存在屬性“l(fā)ength”4.3.3. 合并命名空間同名命名空間最后會(huì)將多個(gè)命名空間導(dǎo)出的內(nèi)容進(jìn)行合并,如下面兩個(gè)命名空間:namespace Validation export const checkNumber = () => namespace Validation export const checkString = () => 面定義兩個(gè)同名

7、命名空間,效果相當(dāng)于:namespace Validation export const checkNumber = () => export const checkString = () => 在命名空間里,有時(shí)我們并不是把所有內(nèi)容都對(duì)外部可見,對(duì)于沒有導(dǎo)出的內(nèi)容,在其它同名命名空間內(nèi)是無(wú)法訪問(wèn)的:namespace Validation const numberReg = /0-9+$/export const stringReg = /A-Za-z+$/ export const checkString = () => namespace Validation expo

8、rt const checkNumber = (value any) => return numberReg test(value) / error 找不到名稱“numberReg”面定義的兩個(gè)命名空間,numberReg沒有使用export導(dǎo)出,所以在第二個(gè)同名命名空間內(nèi)是無(wú)法使用的,如果給const numberReg 前面加 export,就可以在第二個(gè)命名空間使用了。4.3.4. 不同類型合并命名空間分別和類、函數(shù)、枚舉都可以合并,下面我們 說(shuō)明:(1) 命名空間和類這里要求同名的類和命名空間在定義的時(shí)候,類的定義必須在命名空間前面,最后合并之后的效果,一個(gè)包含一些以命名空間導(dǎo)出

9、內(nèi)容為靜態(tài)屬性的類,來(lái)看例子:class Validation checkType() namespace Validation export const numberReg = /0-9+$/ export const stringReg = /A-Za-z+$/ export const checkString = () => namespace Validation export const checkNumber = (value any) => return numberReg test(value)console log(Validation prototype) /

10、checkType fun () console log(Validation prototype constructor)/*checkNumber checkString numberReg stringReg*/(2) 命名空間和函數(shù)在JavaScr pt中,函數(shù)也是對(duì)象,所以可以給一個(gè)函數(shù)設(shè)置屬性,在TypeScr pt中,就可以通過(guò) 合并實(shí)現(xiàn)。但同樣要求,函數(shù)的定義要在同名命名空間前面,我們?cè)倌弥爸v過(guò)的計(jì)數(shù)器的實(shí)現(xiàn)來(lái)看下,如何利用計(jì)數(shù)器的定義:function countUp () countUp count+namespace countUp export let count =

11、 0countUp() countUp()console log(countUp count) / 2(3) 命名空間和枚舉可以通過(guò)命名空間和枚舉的合并,為枚舉拓展內(nèi)容,枚舉和同名命名空間的先后順序是沒有要求的,來(lái)看例子:enum Colors redgreen bluenamespace Colors export const yellow = 3console log(Colors)/*0 "red"1 "green"2 "blue"red 0green 1blue 2yellow 3*/通過(guò)打印結(jié)果你可以發(fā)現(xiàn),雖然我們使用命名空間增加了枚舉的成員,但是最后輸出的值只有key到ndex的 , 沒有ndex到key的 。小結(jié)本小節(jié)我們學(xué)習(xí)了編譯器對(duì)于相同命名的 的合并策略,這個(gè)策略能夠幫我們實(shí)現(xiàn)一些類型定義的復(fù)用,比如多個(gè)函數(shù)定義可合并為一個(gè)函數(shù)的重載,還可以利用 合并實(shí)現(xiàn)一些復(fù)雜的類型定義。但是有時(shí)我們會(huì)無(wú)意地定義了一個(gè)之前定義過(guò)的名字,造成 合并了,再使用這個(gè)新定義的時(shí)候,發(fā)現(xiàn)應(yīng)用了一些這里未定義的類型校驗(yàn),所以我們?cè)诙x名字的時(shí)候要注意這一點(diǎn)。本小節(jié)我們講了接 、命名空間、不同類型是如何合并的,也學(xué)習(xí)了如何利用

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論