鴻蒙崛起:探索新一代技術(shù) 課件 第5章-ArkTS_第1頁
鴻蒙崛起:探索新一代技術(shù) 課件 第5章-ArkTS_第2頁
鴻蒙崛起:探索新一代技術(shù) 課件 第5章-ArkTS_第3頁
鴻蒙崛起:探索新一代技術(shù) 課件 第5章-ArkTS_第4頁
鴻蒙崛起:探索新一代技術(shù) 課件 第5章-ArkTS_第5頁
已閱讀5頁,還剩72頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

鴻蒙崛起第5章:ArkTS延遲符目錄/PREFACE5.15.25.3ArkTS基本知識(shí)ArkTS編程規(guī)范章末知識(shí)概覽導(dǎo)圖/guide5.15.25.3ArkTS基本知識(shí)ArkTS編程規(guī)范章末知識(shí)概覽5.1ArkTS基本知識(shí)PART01在鴻蒙操作系統(tǒng)中,ArkTS技術(shù)是一項(xiàng)關(guān)鍵的創(chuàng)新,它為開發(fā)者提供了一種高效、簡(jiǎn)潔的方式來構(gòu)建應(yīng)用。ArkTS是一種基于TypeScript語言的擴(kuò)展,它結(jié)合了TypeScript的靜態(tài)類型檢查和面向?qū)ο缶幊痰膬?yōu)勢(shì),同時(shí)引入了新的語法和特性,以更好地適應(yīng)HarmonyOS的開發(fā)需求,比如ArkTS支持聲明式UI開發(fā),允許開發(fā)者以更直觀的方式描述用戶界面,同時(shí)也引入了輕量化并發(fā)機(jī)制,這在一定程度上會(huì)簡(jiǎn)化多線程編程的復(fù)雜性,本章將圍繞ArkTS的基礎(chǔ)知識(shí)來介紹ArkTS的具體使用方式。5.1.1ArkTS簡(jiǎn)介從APIversion10開始,ArkTS通過規(guī)范定義強(qiáng)化開發(fā)期的靜態(tài)檢查和代碼分析,從整體上提升程序的執(zhí)行性能和程序運(yùn)行的穩(wěn)定性。目前流行的TypeScript是在JS基礎(chǔ)上通過添加類型定義擴(kuò)展而來的,而ArkTS則是TypeScript的進(jìn)一步擴(kuò)展。TypeScript深受開發(fā)者的喜愛,其原因主要是TypeScript提供了一種更結(jié)構(gòu)化的的JS編碼方式,ArkTS保留了大部分的TypeScript語法,幾乎為現(xiàn)有的TypeScript開發(fā)者實(shí)現(xiàn)了無縫過渡,可以讓移動(dòng)開發(fā)者更快速的上手ArkTS。ArkTS有一個(gè)非常顯著的特點(diǎn)就是著重于處理低運(yùn)行時(shí)的開銷,其對(duì)TypeScript的動(dòng)態(tài)類型特性施加了更嚴(yán)格的限制,這樣可以減少運(yùn)行時(shí)的開銷,能夠提高應(yīng)用程序的運(yùn)行效率。通過取消動(dòng)態(tài)類型特性,代碼能夠更有效的在運(yùn)行前被編譯和優(yōu)化,因此能夠?qū)崿F(xiàn)更快的應(yīng)用啟動(dòng)和更低的功耗。ArkTS在設(shè)計(jì)的時(shí)候也充分考慮了與JS的互通性,這是因?yàn)楹芏嗟囊苿?dòng)端開發(fā)使用的都是JS和TypeScript庫(kù),由于ArkTS提供了與JS的無縫互通,這使得開發(fā)者可以更輕易的將JS代碼集成到自己的應(yīng)用中,因此開發(fā)者如果手中擁有現(xiàn)成的代碼和庫(kù),則可以進(jìn)行ArkTS的開發(fā)。ArkTS是鴻蒙官方推薦的主力應(yīng)用開發(fā)語言,鴻蒙整個(gè)生態(tài)的布局也與ArkTS有著很大的關(guān)系。ArkTS其實(shí)是在TypeScript上做了進(jìn)一步擴(kuò)展,但是它保留了TypeScript的風(fēng)格,而TypeScript又是由JS發(fā)展而來的,如圖所示。本章將指導(dǎo)開發(fā)者了解ArkTS的核心功能、語法和最佳實(shí)踐,使開發(fā)者能夠使用ArkTS高效構(gòu)建高性能的移動(dòng)應(yīng)用。5.1.2ArkTS基礎(chǔ)語法——聲明1.變量聲明ArkTS通過聲明引入變量、常量、函數(shù)和類型。以下通過使用let關(guān)鍵字聲明一個(gè)變量,如圖。lethi:string='hello';hi='hello,world';2.常量聲明通過const關(guān)鍵字引入只讀常量,該常量只能被賦值一次,如圖所示。consthello:string='hello';此時(shí)如果再次對(duì)該變量賦值會(huì)引發(fā)編譯錯(cuò)誤:

hello='fine';//編譯錯(cuò)誤3.自動(dòng)類型判斷ArkTS是一個(gè)靜態(tài)類型的語言,所有數(shù)據(jù)類型都會(huì)在編譯時(shí)確定,然而如果一個(gè)變量或常量的聲明包含了初始值,那么開發(fā)者就不需要顯式指定其類型。ArkTS規(guī)范中列舉了所有允許自動(dòng)推斷類型的場(chǎng)景。在以下示例中,兩條語句的聲明都是有效的,兩個(gè)變量都是string類型,如圖所示。lethi1:string='hello';lethi2='hello,world';5.1.2ArkTS基礎(chǔ)語法——類型在ArkTS中,數(shù)據(jù)分為Number類型、Boolean類型、String類型、Void類型、Object類型、Array類型、Enum類型、Union類型、Aliases類型。1.Number類型ArkTS提供number類型,此類變量通常用于表示任何整數(shù)或者浮點(diǎn)數(shù)。數(shù)字字面量包括整數(shù)字面量和十進(jìn)制浮點(diǎn)字面量。數(shù)字字面量包含以下類別:l由數(shù)字序列組成的十進(jìn)制整數(shù)。例如:0、117、-345l以0x(或0X)開頭的十六進(jìn)制整數(shù),可以包含數(shù)字(0-9)和字母a-f或A-F。例如:0x1123、0x00111、-0xF1A7l以0o(或0O)開頭的八進(jìn)制整數(shù),只能包含數(shù)字(0-7)。例如:0o777l以0b(或0B)開頭的二進(jìn)制整數(shù),只能包含數(shù)字0和1。例如:0b11、0b0011、-0b11浮點(diǎn)字面量包含以下幾種情況:l十進(jìn)制整數(shù),可為有符號(hào)數(shù)(即,前綴為“+”或“-”);l小數(shù)點(diǎn)(“.”)l小數(shù)部分(由十進(jìn)制數(shù)字字符串表示)l以“e”或“E”開頭的指數(shù)部分,后跟有符號(hào)(即,前綴為“+”或“-”)或無符號(hào)整數(shù)。以下示例是聲明一些數(shù)字變量的具體代碼示例,如圖所示。letn1=3.14;letn2=3.141592;letn3=.5;letn4=1e2;5.1.2ArkTS基礎(chǔ)語法——類型functionwork(n:number):number{if(n<=1){return1;}returnn*work(n-1);}//聲明一個(gè)帶有兩個(gè)參數(shù)的函數(shù),參數(shù)類型都是numberfunctionsum(a:number,b:number):number{returna+b;}//使用這個(gè)函數(shù)letresult=sum(5,10);//result的值將是15//聲明一個(gè)帶有兩個(gè)可選參數(shù)的函數(shù),參數(shù)類型都是numberfunctionsum(a:number=0,b:number=0):number{returna+b;}//使用這個(gè)函數(shù),只傳入一個(gè)參數(shù)letresult=sum(5);//result的值將是5,因?yàn)閎的默認(rèn)值是05.1.2ArkTS基礎(chǔ)語法——類型在ArkTS中,數(shù)據(jù)分為Number類型、Boolean類型、String類型、Void類型、Object類型、Array類型、Enum類型、Union類型、Aliases類型。2.Boolean類型letflag:boolean=false;//...if(flag){ console.log('Done!');}3.String類型String指的是字符串或者字符序列,字符串字面量是由單引號(hào)或者雙引號(hào)括起來的0個(gè)到多個(gè)字符,如圖所示。leta='thisisastring';letb='Success';letc='Hello,world!\n';letname='Alice';letgreeting=`Hello,${name}!`;//使用模板字面量嵌入變量//greeting變量將被賦值為字符串"Hello,Alice!"http://${name}部分是模板字面量中的表達(dá)式占位符,它會(huì)被變量name的值所替換。5.1.2ArkTS基礎(chǔ)語法——類型在ArkTS中,數(shù)據(jù)分為Number類型、Boolean類型、String類型、Void類型、Object類型、Array類型、Enum類型、Union類型、Aliases類型。3.String類型letmultiLineString=`Thisisamulti-linestringthatspansmultiplelines.`;letprice=19.99;lettaxRate=0.08;lettotal=`Total:$${(price*(1+taxRate)).toFixed(2)}`;//模板字面量中的$${(price*(1+taxRate)).toFixed(2)}是一個(gè)表達(dá)式//它計(jì)算了商品價(jià)格加上稅后的總額,并將結(jié)果格式化為兩位小數(shù)的字符串。letgreeting="Hello,"+"world!";//可以進(jìn)行字符串連接操作letstr="ArkTS";console.log(str.length);////可以使用length屬性獲取字符串的長(zhǎng)度,輸出

5letfirstChar=str[0];//可以使用索引訪問字符串中的單個(gè)字符,輸出'A'letpart=str.slice(1,3);//可以使用slice()方法可以提取字符串的一部分,數(shù)去'rk'letindex=str.indexOf("TS");//可以使用indexOf()方法可以查找子字符串在字符串中的位置,3可以使用replace()方法可以替換字符串中的部分內(nèi)容:letnewStr=str.replace("TS","JS");//'ArJS'可以使用split()方法可以將字符串分割成數(shù)組:letwords=str.split("");//['A','r','k','T','S']可以使用toLowerCase()和toUpperCase()方法可以轉(zhuǎn)換字符串的大小寫:letlower=str.toLowerCase();//'arkts'letupper=str.toUpperCase();//'ARKTS'可以使用trim()方法可以去除字符串兩端的空白字符:lettrimmed="Hello,world!".trim();//'Hello,world!'可以使用includes()方法可以檢查字符串是否包含某個(gè)子字符串:letcontains=str.includes("TS");//true可以使用repeat()方法可以創(chuàng)建一個(gè)新字符串,它是原字符串重復(fù)指定次數(shù)的結(jié)果:letrepeated="abc".repeat(3);//'abcabcabc'5.1.2ArkTS基礎(chǔ)語法——類型在ArkTS中,數(shù)據(jù)分為Number類型、Boolean類型、String類型、Void類型、Object類型、Array類型、Enum類型、Union類型、Aliases類型。4.void類型在ArkTS中,void類型用于指定函數(shù)沒有返回值。當(dāng)一個(gè)函數(shù)的目的是執(zhí)行某些操作,而不是返回?cái)?shù)據(jù)時(shí),通常會(huì)將其返回類型聲明為void。此外,void類型還可以用于泛型類型參數(shù),當(dāng)泛型的具體類型不重要或不相關(guān)時(shí),可以使用void,如圖所示。//聲明一個(gè)沒有返回值的函數(shù)functiontest():void{//函數(shù)體,不返回任何值}//或者使用void作為泛型類型參數(shù):classClass<T>{//類的實(shí)現(xiàn)}letinstance:Class<void>;//泛型類型參數(shù)的具體類型不相關(guān)在ArkTS中,void類型是引用類型,因此它可以用于泛型類型參數(shù),但不會(huì)用于類型注解或作為值使用。如果嘗試將void用作類型注解或值,將會(huì)導(dǎo)致編譯時(shí)錯(cuò)誤,如下圖代碼將會(huì)導(dǎo)致錯(cuò)誤。letx:void;//編譯時(shí)錯(cuò)誤-void用作類型注解//下面的寫法也是錯(cuò)誤的functionfoo():void{

lety=foo();//void用作值}5.1.2ArkTS基礎(chǔ)語法——類型在ArkTS中,數(shù)據(jù)分為Number類型、Boolean類型、String類型、Void類型、Object類型、Array類型、Enum類型、Union類型、Aliases類型。5.Object類型在ArkTS中,Object類型是所有引用類型的基類型。這意味著任何值,包括基本類型的值(它們會(huì)被自動(dòng)裝箱),都可以直接被賦給Object類型的變量。Object類型可以表示任意對(duì)象,包括數(shù)組、函數(shù)、自定義對(duì)象等。以下是一些關(guān)于Object類型在ArkTS中的使用示例,如圖所示。由于Object類型非常寬泛,可以表示任意對(duì)象,這就導(dǎo)致在使用時(shí)無法確定具體的屬性和方法。例如,如果一個(gè)變量被聲明為Object類型,編譯器無法提供準(zhǔn)確的類型檢查和智能提示,增加了出錯(cuò)的風(fēng)險(xiǎn)。此外,使用Object類型可能會(huì)削弱強(qiáng)類型特性的安全性,因?yàn)樗陬愋蜋z查方面提供的保障較少。因此,在實(shí)際開發(fā)中,

推薦盡可能使用更具體的類型定義,以利用ArkTS的強(qiáng)類型特性,提高代碼的可讀性和可維護(hù)性。constperson:Object={name:'John',age:30,hobbies:['reading','swimming']};console.log();//輸出Johnconsole.log(person.age);//輸出30添加和修改屬性:constcar:Object={brand:'Toyota'};car.model='Camry';car.year=2023;console.log(car);//輸出{brand:'Toyota',model:'Camry',year:2023}方法的使用:constcalculator:Object={add:function(a:number,b:number):number{returna+b;}};console.log(calculator.add(5,3));//輸出85.1.2ArkTS基礎(chǔ)語法——類型在ArkTS中,數(shù)據(jù)分為Number類型、Boolean類型、String類型、Void類型、Object類型、Array類型、Enum類型、Union類型、Aliases類型。6.Array類型在ArkTS中,Array類型用于表示數(shù)組,它是由可賦值給數(shù)組聲明中指定的元素類型的數(shù)據(jù)組成的對(duì)象。數(shù)組的長(zhǎng)度由數(shù)組中元素的個(gè)數(shù)來確定,數(shù)組中第一個(gè)元素的索引為0。以下是一些關(guān)于Array類型的基本操作和用法,如圖所示。letnames:string[]=['Alice','Bob','Carol'];使用push()方法可以在數(shù)組的末尾添加一個(gè)或多個(gè)元素:names.push('David');使用unshift()方法可以在數(shù)組的開頭添加一個(gè)或多個(gè)元素:names.unshift('Eve');使用pop()方法可以刪除數(shù)組的最后一個(gè)元素并返回該元素:letlast=names.pop();使用shift()方法可以刪除數(shù)組的第一個(gè)元素并返回該元素:letfirst=names.shift();使用splice()方法可以在任意位置添加或刪除元素:names.splice(1,1);//刪除索引為1的元素直接通過索引訪問并修改數(shù)組中的元素:names[1]='Frank';可以使用for...of循環(huán)可以遍歷數(shù)組中的每個(gè)元素:for(letnameofnames){console.log(name);}可以通過使用leng屬性來清空數(shù)組:names.length=0;可以使用join函數(shù)將數(shù)組的所有元素添加到由指定分隔符字符串分隔的字符串中:letjoined=names.join(',');可以使用reverse函數(shù)將數(shù)組中的元素逆序:names.reverse();可以使用some函數(shù)來判定某個(gè)數(shù)組中的有無符合特定條件的元素,比如:lethasLongName=names.some(name=>name.length>5);letlowercased=names.map(name=>name.toLowerCase());可以使用map函數(shù)來對(duì)數(shù)組中的每個(gè)元素進(jìn)行自定義操作,會(huì)返回一個(gè)包含結(jié)果的數(shù)組可以使用filter函數(shù)來返回滿足回調(diào)函數(shù)中指定條件的數(shù)組元素letshortNames=names.filter(name=>name.length<=5);5.1.2ArkTS基礎(chǔ)語法——類型在ArkTS中,數(shù)據(jù)分為Number類型、Boolean類型、String類型、Void類型、Object類型、Array類型、Enum類型、Union類型、Aliases類型。7.Enum類型在ArkTs中,enum數(shù)據(jù)類型,也稱為枚舉類型,是一種特殊的值類型,它允許為一組數(shù)值賦予更具可讀性和易于理解的名字。enum類型允許預(yù)先定義一組命名值,這些命名值也被稱為枚舉常量。使用枚舉常量時(shí)必須以枚舉類型名稱為前綴,在這個(gè)例子中,Color是一個(gè)枚舉類型,它包含三個(gè)成員:Red、Green和Blue。默認(rèn)情況下,枚舉成員的值從0開始遞增,所以Color.Red的值為0,Color.Green的值為1,Color.Blue的值為2,如圖所示。enumColorSet{Red,Green,Blue} letc:ColorSet=ColorSet.Red;enumColorSet{White=0xFF,Grey=0x7F,Black=0x00}//顯示設(shè)計(jì)枚舉常量letc:ColorSet=ColorSet.Black;5.1.2ArkTS基礎(chǔ)語法——類型在ArkTS中,數(shù)據(jù)分為Number類型、Boolean類型、String類型、Void類型、Object類型、Array類型、Enum類型、Union類型、Aliases類型。7.Enum類型隱式設(shè)置值:如果省略常量表達(dá)式,則枚舉常量的值將隱式設(shè)置為數(shù)值。如果所有常數(shù)都沒有值,則第一個(gè)常數(shù)的值為零,其他常數(shù)被賦予前一個(gè)常數(shù)加一的值,如圖所示。enumDirection{ Up,//隱式值為0 Down,//隱式值為1 Left,//隱式值為2 Right//隱式值為3}//使用枚舉letdir:Direction=Direction.Left;console.log(dir);//輸出:2//在這個(gè)例子中,Direction是一個(gè)枚舉類型//包含四個(gè)成員:Up、Down、Left和Right//由于沒有為這些成員顯式設(shè)置值,它們的值會(huì)自動(dòng)從0開始遞增//Direction.Up的值為0//Direction.Down的值為1//Direction.Left的值為2//Direction.Right的值為3//因此,當(dāng)將Direction.Left賦值給變量dir時(shí),dir的值為2。這樣,枚舉常量的隱式設(shè)置值使得代碼更加簡(jiǎn)潔和易于理解。5.1.2ArkTS基礎(chǔ)語法——類型在ArkTS中,數(shù)據(jù)分為Number類型、Boolean類型、String類型、Void類型、Object類型、Array類型、Enum類型、Union類型、Aliases類型。7.Enum類型類型限制:枚舉常量對(duì)類型也是有一定限制的,在一個(gè)枚舉中,不能將integer和string類型的枚舉常量組合在一起,否則會(huì)發(fā)生編譯時(shí)錯(cuò)誤。如圖枚舉變量的使用反例。enumMixedEnum{First=1,//數(shù)字類型

Second,//隱式數(shù)字類型,值為2Third="three"http://字符串類型,錯(cuò)誤!不能與前面的數(shù)字類型混合}//MixedEnum枚舉嘗試同時(shí)包含數(shù)字類型的成員和字符串類型的成員//First和Second成員是數(shù)字類型,而Third成員被賦予了一個(gè)字符串值"three"http://這種混合類型的做法在TypeScript中是不允許的,會(huì)導(dǎo)致編譯錯(cuò)誤正確的做法是確保枚舉中的所有成員都是相同的類型。如果需要一個(gè)成員是字符串,那么枚舉中的所有成員都應(yīng)該是字符串,如圖所示。enumStringEnum{First="one",Second="two",Third="three"}//或者全部是數(shù)字enumNumberEnum{First=1,Second=2,Third=3}5.1.2ArkTS基礎(chǔ)語法——類型在ArkTS中,數(shù)據(jù)分為Number類型、Boolean類型、String類型、Void類型、Object類型、Array類型、Enum類型、Union類型、Aliases類型。7.Enum類型枚舉常量的唯一性:所有枚舉常量名稱必須是唯一的。否則,將發(fā)生編譯時(shí)錯(cuò)誤。下圖是一個(gè)違反這一規(guī)則的反例:enumColor{Red,Green,Blue,Red//錯(cuò)誤!'Red'已經(jīng)定義過了}//在這個(gè)例子中,Color枚舉嘗試定義兩個(gè)名為Red的成員,這是不允許的//因?yàn)?/p>

Red已經(jīng)作為一個(gè)枚舉成員存在,再次定義Red會(huì)導(dǎo)致編譯錯(cuò)誤enumColor{Green,Red,Blue}正確的做法是確保每個(gè)枚舉成員的名稱都是唯一的5.1.2ArkTS基礎(chǔ)語法——類型在ArkTS中,數(shù)據(jù)分為Number類型、Boolean類型、String類型、Void類型、Object類型、Array類型、Enum類型、Union類型、Aliases類型。7.Enum類型enumNumericEnum{One,Two,Three}letvalue=NumericEnum.One;console.log(value);//輸出:0console.log(typeofvalue);//輸出:'number'enumStringEnum{Apple="apple",Banana="banana",Cherry="cherry"}letfruit=StringEnum.Banana;console.log(fruit);//輸出:'banana'console.log(typeoffruit);//輸出:'string'枚舉到整數(shù)或字符串的轉(zhuǎn)換:枚舉常量到整數(shù)或字符串類型的隱式轉(zhuǎn)換取決于枚舉的類型。數(shù)字枚舉字符串枚舉5.1.2ArkTS基礎(chǔ)語法——類型在ArkTS中,數(shù)據(jù)分為Number類型、Boolean類型、String類型、Void類型、Object類型、Array類型、Enum類型、Union類型、Aliases類型。8.Union類型在ArkTS中,聯(lián)合類型(Union類型)是一種由多個(gè)類型組合而成的引用類型,它表示一個(gè)值可以是多種類型中的任何一種。這種類型的變量可以被賦予任何組成類型的有效值。下圖是一個(gè)關(guān)于ArkTS中聯(lián)合類型的具體例子和解釋。在這個(gè)例子中,Animal是一個(gè)聯(lián)合類型,它包含了Cat、Dog、Frog這三個(gè)類以及number類型。這意味著可以將Animal類型的變量animal賦值為Cat、Dog、Frog的實(shí)例或者是一個(gè)數(shù)字。聯(lián)合類型允許在同一個(gè)變量中存儲(chǔ)不同類型的值,這在處理具有多種可能類型的數(shù)據(jù)時(shí)非常有用。classCat{

//...}classDog{

//...}classFrog{

//...}//定義一個(gè)聯(lián)合類型,包含Cat、Dog、Frog類以及number類型typeAnimal=Cat|Dog|Frog|number;//現(xiàn)在,Animal類型的變量可以被賦予任何組成類型的實(shí)例或值letanimal:Animal=newCat();animal=newFrog();animal=42;5.1.2ArkTS基礎(chǔ)語法——類型在ArkTS中,數(shù)據(jù)分為Number類型、Boolean類型、String類型、Void類型、Object類型、Array類型、Enum類型、Union類型、Aliases類型。8.Union類型classCat{sleep(){};meow(){}}classDog{sleep(){};bark(){}}classFrog{sleep(){};leap(){}}typeAnimal=Cat|Dog|Frogfunctionfoo(animal:Animal){if(animalinstanceofFrog){animal.leap();//在這里,animal被識(shí)別為Frog類型

}animal.sleep();//Animal類型的所有成員都有sleep方法}此外,當(dāng)需要從聯(lián)合類型的變量中獲取特定類型的值時(shí),可以使用不同的機(jī)制,例如類型檢查或類型斷言。例如,可以使用instanceof操作符來檢查一個(gè)對(duì)象是否是特定類的實(shí)例,如圖所示。在這個(gè)例子中,函數(shù)foo接受一個(gè)Animal類型的參數(shù)。通過使用instanceof操作符,我們可以檢查animal是否是Frog的實(shí)例,并在是的情況下調(diào)用leap方法。同時(shí),由于Animal類型的所有成員都有sleep方法,可以直接在animal上調(diào)用它,而不需要進(jìn)行類型檢查。5.1.2ArkTS基礎(chǔ)語法——類型在ArkTS中,數(shù)據(jù)分為Number類型、Boolean類型、String類型、Void類型、Object類型、Array類型、Enum類型、Union類型、Aliases類型。9.Aliases類型在ArkTS中,別名(Aliases)類型是一種為現(xiàn)有類型或匿名類型(如數(shù)組、函數(shù)、對(duì)象字面量或聯(lián)合類型)提供替代名稱的機(jī)制。使用type關(guān)鍵字來創(chuàng)建類型別名,這有助于提高代碼的可讀性、簡(jiǎn)化復(fù)雜類型,并方便維護(hù)。別名類型可以用來為基本類型、聯(lián)合類型、元組類型、函數(shù)類型等創(chuàng)建別名。可以為基本類型設(shè)置別名,如圖5-34所示。typeMyNumber=number;typeMyString=string;//也可以設(shè)置聯(lián)合類型別名:typeMatrix=number[][];//也可以設(shè)置函數(shù)類型別名:typeHandler=(s:string,no:number)=>string;//也可以設(shè)置泛型類型別名:typePredicate<T>=(x:T)=>boolean;//包含null的類型別名://typeNullableObject=Object|null;當(dāng)一個(gè)類型在代碼中多次出現(xiàn)時(shí),使用類型別名可以使代碼更易于理解。例如,如果有一個(gè)復(fù)雜的數(shù)據(jù)結(jié)構(gòu),使用類型別名可以讓代碼更清晰地表達(dá)其含義;對(duì)于復(fù)雜的類型表達(dá)式,可以使用類型別名來簡(jiǎn)化它們。例如,如果有一個(gè)包含多個(gè)屬性的對(duì)象類型,可以使用類型別名來定義這個(gè)類型,然后在代碼中使用別名來代替復(fù)雜的類型表達(dá)式;如果一個(gè)類型在多個(gè)地方使用,并且需要修改這個(gè)類型,只需要修改類型別名的定義即可,而不需要在每個(gè)使用該類型的地方進(jìn)行修改。5.1.2ArkTS基礎(chǔ)語法——運(yùn)算符復(fù)合賦值運(yùn)算符等效解釋a+=ba=a+b加賦值-=a=a-b減賦值*=a=a*b乘賦值/=a=a/b除賦值%=a=a%b取余賦值<<=a=a<<b左移賦值>>=a=a>>b有符號(hào)右移賦值>>>=a=a>>>b無符號(hào)右移賦值&=a=a&b按位與運(yùn)算賦值|=a=a|b按位或運(yùn)算賦值^=a=a^b按位疑惑運(yùn)算賦值比較運(yùn)算符描述返回值===嚴(yán)格相等(包括類型)布爾!==值不嚴(yán)格相等布爾==相當(dāng)(不考慮類型,只考慮值)布爾!=不相等(不考慮類型,只考慮值)布爾>大于布爾>=大于等于布爾<小于布爾<=小于等于布爾100==='100'//返回false,因?yàn)橐粋€(gè)是數(shù)字類型,另一個(gè)是字符串類型'abc'==='abc'//返回true,因?yàn)橹岛皖愋投枷嗤琋aN===NaN//返回false,因?yàn)镹aN不等于任何值===表示對(duì)兩個(gè)操作數(shù)進(jìn)行比較,而且不僅比較的值,類型也必須是一樣的才會(huì)返回true。而==則僅僅比較兩個(gè)操作數(shù)的值,類型不相等也會(huì)返回true。例子如下圖所示。5.1.2ArkTS基礎(chǔ)語法——運(yùn)算符操作符描述舉例-(一元操作符)取相反數(shù)-a+(一元操作符)取值本身+a--(一元操作符)自減操作--a、a--++(一元操作符)自增操作++a、a+++(二元操作符)加法運(yùn)算a+b-(二元操作符)減法運(yùn)算a-b*(二元操作符)乘法運(yùn)算a*b/(二元操作符)除法運(yùn)算a/b%(二元操作符)取余運(yùn)算a%b操作符描述&按位與|按位或^按位異或~按位取非<<按位左移賦值>>按位有符號(hào)右移賦值>>>按位無符號(hào)右移賦值操作符描述a&&b邏輯與a||b邏輯或!a邏輯非5.1.2ArkTS基礎(chǔ)語法——循環(huán)與判斷if(condition1){ //語句1}elseif(condition2){ //語句2}else{ //else語句}switch(expression){ caselabel1://如果label1匹配,則執(zhí)行

//... //語句1 //... break;//可省略

caselabel2://如果label2或label3匹配,則執(zhí)行

//... //語句23 //... break;//可省略

default: //默認(rèn)語句}//condition?expression1:expression2//在上述表達(dá)式中,如果condition為真,則返回expression1表達(dá)式,否則返回的是expression2表達(dá)式。letisValid=Math.random()>0.5?true:false;letmessage=isValid?'Valid':'Failed';5.1.2ArkTS基礎(chǔ)語法——循環(huán)和判斷//for([init];[condition];[update]){// statements//}//Init表示變量的初始化信息,condition代表的是執(zhí)行循環(huán)的判定條件,//update指的是變量每次執(zhí)行循環(huán)的更新信息(步長(zhǎng))。示例如下:letsum=0;for(leti=0;i<10;i+=2){ sum+=i;}//for(forVarofexpression){// statements//}//定義一個(gè)數(shù)組constnumbers:number[]=[1,2,3,4,5];//使用for...of循環(huán)遍歷數(shù)組for(constnumberofnumbers){console.log(number);//依次打印數(shù)組中的每個(gè)元素}//while(condition){//statements//}letn=0;letx=0;while(n<3){n++;x+=n;}//do{//statements//}while(condition)leti=0;do{ i+=1;}while(i<10)5.1.2ArkTS基礎(chǔ)語法——循環(huán)和判斷l(xiāng)etx=0;while(true){ x++; if(x>5){ break;}}letx=1;label:while(true){ switch(x){ case1: //statements breaklabel;//中斷while語句

}}letsum=0;for(letx=0;x<100;x++){if(x%2==0){continue;}sum+=x;}thrownewError('thiserror') try語句用于捕獲和處理異?;蝈e(cuò)誤:try{ //可能發(fā)生異常的語句塊}catch(e){ //異常處理}5.1.2ArkTS基礎(chǔ)語法——異常classZeroDivisorextendsError{}functiondivide(a:number,b:number):number{

if(b==0)thrownewZeroDivisor();returna/b;}functionprocess(a:number,b:number){try{letres=divide(a,b);console.log('result:'+res);}catch(x){console.log('someerror');}}functionprocessData(s:string){leterror:Error|null=null;try{console.log('Dataprocessed:'+s);//...//可能發(fā)生異常的語句

//...}catch(e){error=easError;//...//異常處理

//...}finally{if(error!=null){console.log(`Errorcaught:input='${s}',message='${error.message}'`);}}}5.1.3函數(shù)在ArkTS中,函數(shù)聲明會(huì)引入一個(gè)函數(shù),聲明包括函數(shù)名、參數(shù)列表、返回類型和函數(shù)體。下圖是一個(gè)簡(jiǎn)單的函數(shù)聲明,包含兩個(gè)String類型的參數(shù),并且返回類型為String。在函數(shù)聲明中,必需為每個(gè)參數(shù)標(biāo)記類型,如果參數(shù)為可選參數(shù),那么允許在調(diào)用函數(shù)時(shí)省略該參數(shù)。參數(shù)的最后一個(gè)參數(shù)可以是rest參數(shù),所謂rest參數(shù)就是允許函數(shù)或方法接受任意數(shù)量的實(shí)參,在隨后的內(nèi)容中會(huì)繼續(xù)進(jìn)行介紹。functionadd(x:string,y:string):string{letz:string=`${x}${y}`;returnz;}functionmultiply(n:number,coeff:number=2):number{returnn*coeff;}multiply(2);//返回2*2multiply(2,3);//返回2*3functionhello(name?:string){if(name==undefined){console.log('Hello!');}else{console.log(`Hello,${name}!`);}}可選參數(shù)可選參數(shù)默認(rèn)值設(shè)定5.1.3函數(shù)Rest參數(shù)是一種特殊的參數(shù),它允許函數(shù)接收一個(gè)不確定數(shù)量的參數(shù)。這些參數(shù)在函數(shù)內(nèi)部被打包成一個(gè)數(shù)組,使得函數(shù)能夠靈活地處理多個(gè)參數(shù),而不需要預(yù)先定義參數(shù)的數(shù)量,Rest參數(shù)通過在參數(shù)名前加上三個(gè)點(diǎn)(...)來表示。下圖是一個(gè)使用Rest參數(shù)的示例,這個(gè)函數(shù)可以計(jì)算傳入的所有數(shù)字的總和。functionsum(...numbers:number[]):number{letres=0;for(letnofnumbers){res+=n;}returnres;}console.log(sum(1,2,3));//輸出6console.log(sum(1,2,3,4,5));//輸出155.1.3函數(shù)如果在函數(shù)內(nèi)部可以推測(cè)出返回值的類型,則可以對(duì)函數(shù)的返回值類型進(jìn)行標(biāo)注,如圖所示。//顯式指定返回類型functionfoo():string{return'foo';}//推斷返回類型為stringfunctiongoo(){return'goo';}如果一個(gè)函數(shù)不要返回值,可以顯式的將返回值標(biāo)識(shí)為void類型或者省略標(biāo)注,如圖所示。functionhi1(){console.log('hi');}functionhi2():void{console.log('hi');}5.1.3函數(shù)函數(shù)中定義的變量和其他實(shí)例僅可以在函數(shù)內(nèi)部訪問,不能從外部訪問。如果函數(shù)中定義的變量與外部作用域中已有實(shí)例同名,則函數(shù)內(nèi)的局部變量定義將覆蓋外部定義。函數(shù)作用域是指函數(shù)內(nèi)部可以訪問的變量范圍,ArkTS遵循大多數(shù)現(xiàn)代編程語言的常見作用域規(guī)則,即在函數(shù)內(nèi)部聲明的變量是局部的,只能在該函數(shù)內(nèi)部訪問。下圖展示的是ArkTS中函數(shù)作用域的代碼示例。//全局變量letglobalVar="我是全局變量";functiontestScope(){//局部變量

letlocalVar="我是局部變量";//可以訪問全局變量

console.log(globalVar);//輸出:我是全局變量

//函數(shù)內(nèi)部的另一個(gè)函數(shù),可以訪問外部函數(shù)的局部變量

functioninnerFunction(){console.log(localVar);//輸出:我是局部變量

}

innerFunction();//嘗試訪問內(nèi)部函數(shù)的變量會(huì)導(dǎo)致錯(cuò)誤,因?yàn)樗鼈儾辉诋?dāng)前作用域內(nèi)

//console.log(anotherVar);//錯(cuò)誤:anotherVarisnotdefined}//可以訪問全局變量console.log(globalVar);//輸出:我是全局變量//嘗試訪問函數(shù)內(nèi)部的局部變量會(huì)導(dǎo)致錯(cuò)誤,因?yàn)樗鼈儾辉谌肿饔糜騼?nèi)//console.log(localVar);//錯(cuò)誤:localVarisnotdefined//調(diào)用函數(shù)testScope();5.1.3函數(shù)通過調(diào)用函數(shù)來執(zhí)行函數(shù)中的函數(shù)體,同其他編程語言一樣,函數(shù)在調(diào)用時(shí)需要指定函數(shù)名稱和參數(shù),如圖5-57函數(shù)調(diào)用。該例子先定義了一個(gè)join函數(shù),這個(gè)函數(shù)需要兩個(gè)stirng類型的變量,通過參數(shù)傳遞將兩個(gè)參數(shù)傳遞到字符串模板中,然后將生成的最終字符串存放在變量z中,然后進(jìn)行值返回;在調(diào)用時(shí)直接聲明函數(shù)名稱和參數(shù)內(nèi)容。functionjoin(x:string,y:string):string{letz:string=`${x}${y}`;returnz;}//然后調(diào)用這個(gè)函數(shù):letx=join('hello','world');console.log(x);5.1.3函數(shù)函數(shù)類型是一種特殊的類型,用于定義函數(shù)的參數(shù)類型和返回值類型。這與TypeScript中的函數(shù)類型定義非常相似。函數(shù)類型的用途主要有以下幾種:(1)類型檢查:在編譯時(shí),ArkTS的編譯器會(huì)檢查函數(shù)調(diào)用是否符合其類型定義,確保參數(shù)和返回值的類型正確。(2)接口定義:函數(shù)類型常用于接口定義中,以確保實(shí)現(xiàn)該接口的類或?qū)ο笾械暮瘮?shù)符合特定的簽名。(3)泛型:函數(shù)類型可以與泛型結(jié)合使用,以創(chuàng)建更靈活的代碼。//定義一個(gè)函數(shù)類型typeAddFunction=(x:number,y:number)=>number;//返回number類型//實(shí)現(xiàn)這個(gè)函數(shù)類型的函數(shù)functionadd(x:number,y:number):number{returnx+y;}//將函數(shù)賦值給一個(gè)變量,該變量的類型是上面定義的函數(shù)類型letmyAddFunction:AddFunction=add;//使用這個(gè)函數(shù)類型的變量調(diào)用函數(shù)console.log(myAddFunction(5,10));//輸出:155.1.3函數(shù)Lambda函數(shù)又稱為箭頭函數(shù),它其實(shí)是ES6標(biāo)準(zhǔn)中引入的一個(gè)特性,其可以提供一種更簡(jiǎn)潔的語法來編寫函數(shù)規(guī)則,箭頭函數(shù)在JavaScript中非常流行,因?yàn)樗鼈兪沟煤瘮?shù)表達(dá)式更加簡(jiǎn)潔,并且具有詞法作用域(lexicalscoping)的特性,即它們不會(huì)創(chuàng)建自己的this、arguments、super或new.target綁定。

箭頭函數(shù)的基本語法如下:參數(shù)列表=>{

函數(shù)體}如果函數(shù)體只有一條語句,可以省略大括號(hào)和return關(guān)鍵字,直接返回該表達(dá)式的結(jié)果:參數(shù)列表=>表達(dá)式如果函數(shù)沒有參數(shù),需要使用空括號(hào)():()=>{

函數(shù)體}letadd:(a:number,b:number)=>number=(x,y)=>x+y;console.log(add(1,2));//輸出:3沒有參數(shù)的箭頭函數(shù):letsayHello:()=>void=()=>console.log('Hello,ArkTS!');sayHello();//輸出:Hello,ArkTS!使用對(duì)象字面量作為函數(shù)體,在對(duì)象中使用箭頭函數(shù)來定義函數(shù):letobj={method:(name:string):string=>`Hello,${name}`};console.log(obj.method('world'));//輸出:Hello,world使用箭頭函數(shù)來作為回調(diào)函數(shù),也就是在map中使用箭頭函數(shù)定義每個(gè)元素需要指定的函數(shù)規(guī)則:[1,2,3].map((x:number):number=>x*2);//輸出:[2,4,6]使用參數(shù)默認(rèn)值和剩余參數(shù):letgreet:(name:string,...greetings:string[])=>string=(name='Guest',...greetings)=>{returngreetings.join('')+','+name;};console.log(greet('Tom','Hello','How','are','you?'));//輸出:HelloHowareyou?,Tom5.1.3函數(shù)閉包從JS開始就是一個(gè)非常重要的概念,這個(gè)重要的概念在ArkTS中也一樣,它由函數(shù)以及創(chuàng)建該函數(shù)時(shí)其詞法環(huán)境的信息組合而成。閉包主要有兩個(gè)核心的要點(diǎn),其中一個(gè)是“詞法作用域”,它指的是函數(shù)被創(chuàng)建時(shí),其周圍環(huán)境的狀態(tài),包括能訪問的變量等。另一個(gè)是“函數(shù)”,它指的是在某個(gè)詞法作用域內(nèi)聲明的函數(shù)。同時(shí),閉包有以下特點(diǎn):(1)訪問外部函數(shù)變量:閉包可以訪問并操作其外部函數(shù)(即父函數(shù))的變量,即使外部函數(shù)已經(jīng)執(zhí)行完畢。(2)詞法綁定:閉包的this值由其詞法作用域決定,而不是運(yùn)行時(shí)的上下文。(3)函數(shù)的函數(shù):閉包通常通過函數(shù)返回另一個(gè)函數(shù)來形成,使得返回的函數(shù)能夠訪問外部函數(shù)的變量。5.1.3函數(shù)functionouterFunction(outerVar){//內(nèi)部函數(shù)可以訪問外部函數(shù)的變量

functioninnerFunction(){console.log(outerVar);}//返回內(nèi)部函數(shù),形成閉包

returninnerFunction;}//創(chuàng)建閉包varclosure=outerFunction("Hello,Closure!");//調(diào)用閉包,訪問外部函數(shù)的變量closure();//輸出:Hello,Closure!functioncreateCounter(){letcount=0;//這是一個(gè)私有變量,外部無法直接訪問

//返回一個(gè)對(duì)象,包含三個(gè)公共方法

return{increment:function(){count++;//內(nèi)部函數(shù)可以訪問外部函數(shù)的變量

console.log(count);},decrement:function(){count--;//內(nèi)部函數(shù)可以訪問外部函數(shù)的變量console.log(count);},getCount:function(){returncount;//提供一個(gè)方法來獲取私有變量的值

}};}//使用閉包創(chuàng)建一個(gè)計(jì)數(shù)器實(shí)例constcounter=createCounter();//調(diào)用計(jì)數(shù)器的方法counter.increment();//輸出:1counter.increment();//輸出:2counter.decrement();//輸出:1console.log(counter.getCount());//輸出:15.1.3函數(shù)閉包在JavaScript中的作用主要體現(xiàn)在以下幾個(gè)方面:(1)數(shù)據(jù)封裝和隱私:閉包允許函數(shù)訪問其外部作用域的變量,這些變量對(duì)于外部世界是私有的,從而實(shí)現(xiàn)了數(shù)據(jù)的封裝和隱私保護(hù)。(2)維持狀態(tài):閉包可以保持變量的狀態(tài),即使外部函數(shù)已經(jīng)執(zhí)行完畢。這使得閉包非常適合用于需要持久化狀態(tài)的場(chǎng)景。(3)函數(shù)工廠:閉包可以用來創(chuàng)建函數(shù)工廠,即返回新函數(shù)的函數(shù)。這些新函數(shù)可以訪問并操作閉包中定義的變量。(4)柯里化:閉包是實(shí)現(xiàn)柯里化(Currying)的基礎(chǔ),它允許將一個(gè)多參數(shù)的函數(shù)轉(zhuǎn)換成一系列單參數(shù)的函數(shù),從而使得函數(shù)調(diào)用更加靈活。(5)模塊模式:閉包是實(shí)現(xiàn)模塊模式的關(guān)鍵,它允許將相關(guān)的變量和函數(shù)封裝在一起,同時(shí)隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié),只暴露公共接口。(6)迭代器和生成器:閉包在迭代器和生成器中用于保存迭代的中間狀態(tài),使得迭代器能夠在每次調(diào)用時(shí)記住其狀態(tài),并在下一次調(diào)用時(shí)從上次停止的地方繼續(xù)。(7)事件處理器:閉包在事件處理器中用于保存事件處理函數(shù)的狀態(tài),使得事件處理函數(shù)能夠在事件發(fā)生時(shí)訪問到定義它時(shí)的作用域。(8)高階函數(shù):閉包使得高階函數(shù)成為可能,即函數(shù)可以作為參數(shù)傳遞給其他函數(shù),或者從其他函數(shù)返回,這增加了函數(shù)的靈活性和可重用性。(9)記憶化:閉包可以用于實(shí)現(xiàn)記憶化(Memoization),這是一種優(yōu)化技術(shù),通過存儲(chǔ)函數(shù)的結(jié)果來避免重復(fù)計(jì)算,從而提高性能。(10)私有變量和狀態(tài)管理:閉包可以用來創(chuàng)建具有私有狀態(tài)的函數(shù),這在模擬類的行為時(shí)非常有用,尤其是在JavaScript中,類的概念是后來添加的。5.1.3函數(shù)函數(shù)重載是一種允許開發(fā)者為同一個(gè)函數(shù)提供多個(gè)定義的行為,這些定義可以有不同的參數(shù)列表(參數(shù)數(shù)量或類型)。函數(shù)重載主要用于編譯期的類型檢查,并不會(huì)在運(yùn)行時(shí)保留多個(gè)函數(shù)體的實(shí)現(xiàn)。通過函數(shù)重載,可以使得函數(shù)根據(jù)傳入?yún)?shù)的類型或數(shù)量,執(zhí)行不同的邏輯,如圖。//聲明函數(shù)重載functionadd(a:number,b:number):number;functionadd(a:string,b:string):string;//實(shí)現(xiàn)函數(shù)重載functionadd(a:any,b:any):any{returna+b;}//使用函數(shù)重載letsum=add(5,10);//調(diào)用第一個(gè)重載函數(shù),返回?cái)?shù)值15letconcatenated=add("Hello,","World!");//調(diào)用第二個(gè)重載函數(shù),返回字符串"Hello,World!"console.log(sum);//輸出:15console.log(concatenated);//輸出:Hello,World!5.1.4類在ArkTS中也可以定義類,類可以理解為一個(gè)開發(fā)者自定義的變量類型,這個(gè)類型是一個(gè)復(fù)合類型,其中是由多種基本類型變量組成的,并且可以通過函數(shù)來規(guī)定一些數(shù)據(jù)行為。在類中有字段、方法、構(gòu)造函數(shù)等相關(guān)內(nèi)容。classStudent{name:string='張三';age:string='20';}classStudent{name:string='張三';age:string='20';getAll():string{return+''+this.age;}}//constructor([parameters]){//...//}//同java一樣,如果一個(gè)類中沒有定義構(gòu)造函數(shù),則默認(rèn)有一個(gè)無參構(gòu)造函數(shù)。classPoint{x:number=0;y:number=0;}letp=newPoint();5.1.4類在ArkTS中類也有繼承關(guān)系,可以使用super關(guān)鍵字來顯式調(diào)用直接父類的構(gòu)造函數(shù),如圖5-66所示。在該例子中Square類中的構(gòu)造函數(shù)就是通過super關(guān)鍵字調(diào)用其父類RectangleSize的構(gòu)造函數(shù)。classRectangleSize{constructor(width:number,height:number){//...}}classSquareextendsRectangleSize{constructor(side:number){super(side,side);}}5.1.4類構(gòu)造函數(shù)也具有重載功能,通過這種方式可以指定構(gòu)造函數(shù)的不同調(diào)用方式,具體來說就是一個(gè)為同一個(gè)構(gòu)造函數(shù)寫入多個(gè)同名但是簽名不同的構(gòu)造函數(shù)頭,構(gòu)造函數(shù)的實(shí)現(xiàn)緊隨其后,如圖所示。classGreeter{//重載簽名1:一個(gè)參數(shù)

constructor(greeting:string);//重載簽名2:兩個(gè)參數(shù)

constructor(greeting:string,name:string);//構(gòu)造函數(shù)實(shí)現(xiàn)

constructor(greeting:string,name?:string){if(name){console.log(greeting+","+name);}else{console.log(greeting);}}}//使用不同的參數(shù)調(diào)用構(gòu)造函數(shù)letgreeter1=newGreeter("Hello");//Helloletgreeter2=newGreeter("Hello","world");//Hello,world5.1.4類類的屬性和方法都是可以使用可見性修飾符,可見性修飾符包括:private、protected和public。默認(rèn)可見性為public。public所修飾的類成員(指字段、方法、構(gòu)造函數(shù)),凡是能夠訪問該類的地方,其被public所修飾的成員變量都是可見的,如圖。classPerson{//用public修飾的字段,可以在類的外部訪問

publicname:string;

publicage:number;//用public修飾的構(gòu)造函數(shù),用于初始化類的成員

publicconstructor(name:string,age:number){=name;this.age=age;}//用public修飾的方法,可以在類的外部調(diào)用

publicgreet(){console.log(`Hello,mynameis${}andIam${this.age}yearsold.`);}}//創(chuàng)建Person類的實(shí)例constperson=newPerson('Alice',30);//訪問public修飾的字段console.log();//輸出:Aliceconsole.log(person.age);//輸出:30//調(diào)用public修飾的方法person.greet();//輸出:Hello,mynameisAliceandIam30yearsold.5.1.4類private所修飾的類成員(指字段、方法、構(gòu)造函數(shù)),不能在類之外被訪問。classC{publicx:string='';privatey:string='';set_y(new_y:string){this.y=new_y;//OK,因?yàn)閥在類本身中可以訪問

}}letc=newC();c.x='a';//OK,該字段是公有的c.y='b';//編譯時(shí)錯(cuò)誤:'y'不可見protected修飾符的作用與private修飾符非常相似,不同點(diǎn)是protected修飾的成員允許在派生類中訪問,例如:classBase{

protectedx:string='';privatey:string='';}classDerivedextendsBase{foo(){this.x='a';//OK,訪問受保護(hù)成員

this.y='b';//編譯時(shí)錯(cuò)誤,'y'不可見,因?yàn)樗撬接械?/p>

}}5.1.4類對(duì)象字面量其實(shí)是一個(gè)表達(dá)式,可以用創(chuàng)建類實(shí)例,更重要的是可以提供一些初始化的值,這在某些情況下比較方便,可以來代替new關(guān)鍵字的作用。對(duì)象字面量的表現(xiàn)方式通過一對(duì)花括號(hào)囊括鍵值對(duì)列表來完成對(duì)象字面量的創(chuàng)建,如圖。classC{n:number=0;s:string='';}letc:C={n:42,s:'foo'};classC{n:number=0;s:string='';}functionfoo(c:C){}letc:Cc={n:42,s:'foo'};//使用變量的類型foo({n:42,s:'foo'});//使用參數(shù)的類型functionbar():C{return{n:42,s:'foo'};//使用返回類型}//也可以在數(shù)組元素類型或類字段類型中使用:letcc:C[]=[{n:1,s:'a'},{n:2,s:'b'}];//也可以在數(shù)組元素和類字段類型中使用:letcc:C[]=[{n:1,s:'a'},{n:2,s:'b'}];letmap:Record<string,number>={'John':25,'Mary':21,}map['John'];//25interfacePersonInfo{age:number;salary:number;}letmap:Record<string,PersonInfo>={'John':{age:25,salary:10},'Mary':{age:21,salary:20}}5.1.4類帶有修飾符abstract的類就是抽象類,抽象類可以用于表示某些類的抽象部分。抽象類可以被定義,但是不可以被創(chuàng)建,下面例子中的定義是沒問題的,但是通過new創(chuàng)建會(huì)產(chǎn)生編譯錯(cuò)誤,如圖所示。abstractclassX{field:number;constructor(p:number){this.field=p;}}letx=newX(666)//編譯時(shí)錯(cuò)誤:不能創(chuàng)建抽象類的具體實(shí)例abstractclassBase{field:number;constructor(p:number){this.field=p;}}classDerivedextendsBase{constructor(p:number){super(p);}}letd=newDerived(666);5.1.5接口接口是一種引用類型,它定義了一組方法規(guī)范,這些方法可以由任何實(shí)現(xiàn)了該接口的類來實(shí)現(xiàn),接口在程序開發(fā)規(guī)范中有很重要的地位。任何一個(gè)類的實(shí)例實(shí)現(xiàn)了接口之后,就可以通過該接口實(shí)現(xiàn)多態(tài),所謂多態(tài)就是指同一個(gè)接口被不同的實(shí)現(xiàn)類實(shí)現(xiàn)了具體的實(shí)現(xiàn)細(xì)節(jié),這個(gè)過程就可以稱之為多態(tài)。接口同類一樣,也需要定義屬性和方法。接口聲明的語法如圖所示。//接口:interfaceAreaSize{

calculateAreaSize():number;//方法的聲明

someMethod():void;//方法的聲明}//實(shí)現(xiàn):classRectangleSizeimplementsAreaSize{privatewidth:number=0;privateheight:number=0;

someMethod():void{console.log('someMethodcalled');}

calculateAreaSize():number{this.someMethod();//調(diào)用另一個(gè)方法并返回結(jié)果

returnthis.width*this.height;}}5.1.5接口接口中常常會(huì)要定義接口屬性,接口屬性和類屬性類似,它可以是普通字段、getter、setter或者是gettet&setter。以下兩種接口定義的寫法是等價(jià)的,如圖所示。interfaceStyle{color:string;}//與下面代碼等價(jià)interfaceStyle{getcolor():string;setcolor(x:string);}interfaceStyle{color:string;}//直接引用classStyledRectangleimplementsStyle{color:string='';}//通過private修飾,并通過getter、setter來控制變量的存取classStyledRectangleimplementsStyle{private_color:string='';getcolor():string{

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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)論