一、背景
HarmonyOS 應(yīng)用的主要開(kāi)發(fā)語(yǔ)言是 ArkTS,它由 TypeScript(簡(jiǎn)稱TS)擴(kuò)展而來(lái),在繼承TypeScript語(yǔ)法的基礎(chǔ)上進(jìn)行了一系列優(yōu)化,使開(kāi)發(fā)者能夠以更簡(jiǎn)潔、更自然的方式開(kāi)發(fā)應(yīng)用。值得注意的是,TypeScript 本身也是由另一門語(yǔ)言 JavaScript 擴(kuò)展而來(lái)。因此三者的關(guān)系如下圖所示
二、TypeScript
2.1、運(yùn)行環(huán)境
2.1.1、線上Playground
TypeScript提供了一個(gè)線上的 Playground 供練習(xí)使用,地址為TypeScript: 演練場(chǎng) - 一個(gè)用于 TypeScript 和 JavaScript 的在線編輯器。
2.1.2、本地運(yùn)行環(huán)境?
2.1.2.1、采用的是VSCode 編輯器
2.1.2.2、前提條件
1、安裝插件:Code Runner:它提供了簡(jiǎn)便的代碼執(zhí)行功能,支持多種編程語(yǔ)言,使開(kāi)發(fā)者能夠快速運(yùn)行和調(diào)試代碼片段。
2、安裝Node.js并配置Path
環(huán)境變量
說(shuō)明:我已經(jīng)安裝了Node.js,便不重復(fù)安裝了
為了方便在終端執(zhí)行Node.js相關(guān)的命令,我們需要將Node.js的安裝目錄加入到Path
環(huán)境變量下
步驟1:首先在DevEco Studio的設(shè)置界面查看Node.js的安裝目錄
步驟2:然后打開(kāi)環(huán)境變量配置面板,按下?Win
+R?
,喚起運(yùn)行窗口,之后運(yùn)行命令?sysdm.cpl?
步驟3:點(diǎn)擊高級(jí)選項(xiàng)卡,并點(diǎn)擊環(huán)境變量
步驟4:在系統(tǒng)變量中選中?Path?
,并點(diǎn)擊編輯
步驟5:點(diǎn)擊新建,并填入Node.js的安裝目錄,完成后點(diǎn)擊確定
3、安裝ts-node
這是一個(gè) TypeScript 的運(yùn)行環(huán)境,它允許我們直接運(yùn)行 TypeScript 代碼。ts-node的安裝和運(yùn)行依賴于Node.js環(huán)境,已經(jīng)安裝了Node.js
npm install -g ts-node
在終端中輸入node -v 和ts-node -v后出現(xiàn)各自版本,說(shuō)明這兩個(gè)已經(jīng)安裝成功了,如下:
注:完成后需要重新啟動(dòng)VSCode,另其重新加載環(huán)境變量和相關(guān)依賴。
2.1.2.3、編寫程序并運(yùn)行
首先在合適的位置創(chuàng)建一個(gè)工程目錄,例如C:\Users\......\hello-ts
,然后使用VSCode打開(kāi)目錄,創(chuàng)建ts文件,并編寫Typescript代碼運(yùn)行
問(wèn)題:運(yùn)行ts時(shí)出現(xiàn)以下錯(cuò)誤,百度后發(fā)現(xiàn)是由于 ts-node 版本升級(jí)導(dǎo)致的兼容性問(wèn)題
解決:需要在項(xiàng)目中安裝??@types/node?
npm install --save-dev @types/node
效果:?安裝??@types/node?后,再運(yùn)行就能夠正常打印日志了
2.2、聲明
2.2.1、變量聲明
2.2.2、常量聲明
?let
用于聲明變量,而const
用于聲明常量,兩者的區(qū)別是變量在賦值后可以修改,而常量在賦值后便不能再修改。
const b:number = 200;
2.2.3、類型推斷?
如果一個(gè)變量或常量的聲明包含了初始值,TS 便可以根據(jù)初始值進(jìn)行類型推斷,此時(shí)我們就可以不顯式指定其類型,例如
let c = 60;
console.log(typeof c); //number
2.3、常用數(shù)據(jù)類型?
2.3.1、number
number
表示數(shù)字,包括整數(shù)和浮點(diǎn)數(shù),例如: 100
、-33
、2.5
、-3.9
let a :number = 100
let b :number = -33
let c :number = 2.5
let d :number = -3.9
2.3.2、string?
string
表示字符串,例如: 你好
、hello
let a:string = '你好'
let b:string = 'hello'
?2.3.3、boolean
boolean
表示布爾值,可選值為:true
、false
let isOpen:boolean = true
let isDone:boolean = false
?2.3.4、數(shù)組
數(shù)組類型定義由兩部分組成,元素類型[]
,例如number[]
表示數(shù)字?jǐn)?shù)組,string[]
表示字符串?dāng)?shù)組,數(shù)組類型的變量可由數(shù)組字面量——[item1,item2,item3]
進(jìn)行初始化。
let a: number[] = []
let b: string[] = ['你好', 'hello']
2.3.5、對(duì)象?
在TS中,對(duì)象(object)是一種一系列由屬性名稱和屬性值組成的數(shù)據(jù)結(jié)構(gòu),例如姓名:'張三', 年齡:10, 性別:'男'
。對(duì)象類型的聲明需要包含所有屬性的名稱及類型,例如{name: string, age: number, gender: string}
,對(duì)象類型的變量可以通過(guò)對(duì)象字面量——{name:'張三', age:10, gender:'男'}
進(jìn)行初始化。
let person: {name:string, age:number, gender:string} = {name:'張三', age:10, gender:'男'};
2.4、函數(shù)?
2.4.1、函數(shù)聲明語(yǔ)法
聲明函數(shù)的基礎(chǔ)語(yǔ)法如下
2.4.2、參數(shù)
2.4.2.1、特殊語(yǔ)法
①可選參數(shù)
可選參數(shù)通過(guò)參數(shù)名后的?
進(jìn)行標(biāo)識(shí),如以下案例中的gender?
參數(shù)。
function getPersonInfo(name: string, age: number, gender?: string): string {
if (gender === undefined) {
gender = '未知'
}
return `name:${name},age:${age},gender:${gender}`;
}
let p1 = getPersonInfo('zhagnsan', 10, '男')
let p2 = getPersonInfo('lisi', 15);
console.log(p1);
console.log(p2);
注:調(diào)用函數(shù)時(shí),未傳遞可選參數(shù),則該參數(shù)的值為undefined
。
②默認(rèn)參數(shù)
可在函數(shù)的參數(shù)列表為參數(shù)指定默認(rèn)值,如以下案例中的gender: string='未知'
參數(shù)。
function getPersonInfo(name: string, age: number, gender: string='未知'): string {
return `name:${name},age:${age},gender:${gender}`;
}
let p1 = getPersonInfo('zhagnsan', 10, '男')
let p2 = getPersonInfo('lisi', 15);
console.log(p1);
console.log(p2);
2.4.2.2、 特殊類型
①聯(lián)合類型
一個(gè)函數(shù)可能用于處理不同類型的值,這種情況可以使用聯(lián)合類型,例如以下案例中的message: number | string
function printNumberOrString(message: number | string) {
console.log(message)
}
printNumberOrString('a')
printNumberOrString(1)
②任意類型
?若函數(shù)需要處理任意類型的值,則可以使用any
類型,例如以下案例中的message: any
function print(message:any) {
console.log(message)
}
print('a')
print(1)
print(true)
2.4.3、 返回值
2.4.3.1、特殊類型
若函數(shù)沒(méi)有返回值,則可以使用void
作為返回值類型,其含義為空。
function test(): void {
console.log('hello');
}
2.4.3.2、類型推斷
函數(shù)的返回值類型可根據(jù)函數(shù)內(nèi)容推斷出來(lái),因此可以省略不寫。
function test() {
console.log('hello');
}
function sum(a: number, b: number) {
return a + b;
}
2.4.4、函數(shù)聲明特殊語(yǔ)法
①匿名函數(shù)
匿名函數(shù)的語(yǔ)法結(jié)構(gòu)簡(jiǎn)潔,特別適用于簡(jiǎn)單且僅需一次性使用的場(chǎng)景。
let numbers: number[] = [1, 2, 3, 4, 5]
numbers.forEach(function (number) {
console.log(number);
})
注意:匿名函數(shù)能夠根據(jù)上下文推斷出參數(shù)類型,因此參數(shù)類型可以省略。
②箭頭函數(shù)
匿名函數(shù)的語(yǔ)法還可以進(jìn)一步的簡(jiǎn)化,只保留參數(shù)列表和函數(shù)體兩個(gè)核心部分,兩者用=>
符號(hào)連接。
let numbers: number[] = [1, 2, 3, 4, 5]
numbers.forEach((num) => { console.log(num) })
2.5、類
2.5.1、類介紹
類(class)是面向?qū)ο缶幊陶Z(yǔ)言中的一個(gè)重要概念。
面向?qū)ο缶幊蹋∣bject-Oriented Programming,簡(jiǎn)稱OOP)是一種編程范式,其核心理念在于將程序中的數(shù)據(jù)與操作數(shù)據(jù)的方法有機(jī)地組織成對(duì)象,從而使程序結(jié)構(gòu)更加模塊化和易于理解。通過(guò)對(duì)象之間的協(xié)同合作,實(shí)現(xiàn)更為復(fù)雜的程序功能。
類(class)是對(duì)象的藍(lán)圖或模板,它定義了對(duì)象的屬性(數(shù)據(jù))和行為(方法)。通過(guò)類可以創(chuàng)建多個(gè)具有相似結(jié)構(gòu)和行為的對(duì)象。例如定義一個(gè) Person
類,其對(duì)象可以有張三
、李四
等等。
2.5.2、語(yǔ)法說(shuō)明
2.5.2.1、類的定義
class Person {
id: number;
name: string;
age: number = 18;
constructor(id: number, name: string) {
this.id = id;
this.name = name;
}
introduce(): string {
return `hello,I am ${this.name},and I am ${this.age} years old`
}
}
2.5.2.2、對(duì)象創(chuàng)建
①語(yǔ)法
創(chuàng)建對(duì)象的關(guān)鍵字為new
,具體語(yǔ)法如下
let person = new Person(1,'zhangsan');
②對(duì)象屬性的訪問(wèn)
console.log(person.name); //讀
person.name = 'lisi'; //寫
console.log(person.name);
③對(duì)象方法的調(diào)用
對(duì)象創(chuàng)建后,便可通過(guò)對(duì)象調(diào)用類中聲明的方法,如下
let intro = person.introduce();
console.log(intro);
2.5.2.3、靜態(tài)成員
Typescript 中的類中可以包含靜態(tài)成員(靜態(tài)屬性和靜態(tài)方法),靜態(tài)成員隸屬于類本身,而不屬于某個(gè)對(duì)象實(shí)例。靜態(tài)成員通用用于定義一些常量,或者工具方法。
①聲明靜態(tài)成員
定義靜態(tài)成員需要使用static
關(guān)鍵字。
class Constants{
static count:number=1;
}
class Utils{
static toLowerCase(str:string){
return str.toLowerCase();
}
}
console.log(Constants.count);
console.log(Utils.toLowerCase('Hello World'));
②使用靜態(tài)成員
靜態(tài)成員無(wú)需通過(guò)對(duì)象實(shí)例訪問(wèn),直接通過(guò)類本身訪問(wèn)即可。
console.log(Constants.count);
console.log(Utils.toLowerCase('Hello World'));
2.5.3、繼承
繼承是面向?qū)ο缶幊讨械闹匾獧C(jī)制,允許一個(gè)類(子類或派生類)繼承另一個(gè)類(父類或基類)的屬性和方法。子類可以直接使用父類的特性,并根據(jù)需要添加新的特性或覆蓋現(xiàn)有的特性。這種機(jī)制賦予面向?qū)ο蟪绦蛄己玫臄U(kuò)展性。
class Student extends Person {
classNumber: string;
constructor(id: number, name: string, classNumber: string) {
super(id, name);
this.classNumber = classNumber;
}
introduce(): string {
return super.introduce()+`, and I am a student`;
}
}
let student = new Student(1,'xiaoming','三年二班');
console.log(student.introduce());
注意:
- 類的繼承需要使用關(guān)鍵字
extends
- 子類構(gòu)造器中需使用
super()
調(diào)用父類構(gòu)造器對(duì)繼承自父類的屬性進(jìn)行初始化。- 在子類中可以使用
this
關(guān)鍵字訪問(wèn)繼承自父類的屬性和方法。- 在子類中可以使用
super
關(guān)鍵字訪問(wèn)父類定義的方法。
2.5.4、訪問(wèn)修飾符
訪問(wèn)修飾符(Access Modifiers)用于控制類成員(屬性、方法等)的可訪問(wèn)性。TypeScript提供了三種訪問(wèn)修飾符,分別是private、protected和public。
class Person {
private id: number;
protected name: string;
public age: number;
constructor(id: number, name: string, age: number) {
this.id = id;
this.name = name;
this.age = age;
}
}
class Student extends Person {
}
說(shuō)明:
- private 修飾的屬性或方法是私有的,只能在聲明它的類中的被訪問(wèn)。
- protected 修飾的屬性或方法是受保護(hù)的,只能在聲明它的類和其子類中被訪問(wèn)。
- public 修飾的屬性或方法是公有的,可以在任何地方被訪問(wèn)到,默認(rèn)所有的屬性和方法都是 public 的。
2.6、接口
2.6.1、接口介紹
接口(interface)是面向?qū)ο缶幊讨械牧硪粋€(gè)重要概念。接口通常會(huì)作為一種契約或規(guī)范讓類(class)去遵守,確保類實(shí)現(xiàn)某些特定的行為或功能。
2.6.2、語(yǔ)法說(shuō)明
①接口定義
接口使用interface
關(guān)鍵字定義,通常情況下,接口中只會(huì)包含屬性和方法的聲明,而不包含具體的實(shí)現(xiàn)細(xì)節(jié),具體的細(xì)節(jié)由其實(shí)現(xiàn)類完成。
interface Person {
id: number;
name: string;
age: number;
introduce(): void;
}
②接口實(shí)現(xiàn)
接口的實(shí)現(xiàn)需要用到implements
關(guān)鍵字,實(shí)現(xiàn)類中,需要包含接口屬性的賦值邏輯,以及接口方法的實(shí)現(xiàn)邏輯。
class Student implements Person {
id: number;
name: string;
age: number;
constructor(id: number, name: string, age: number) {
this.id = id;
this.name = name;
this.age = age;
}
introduce(): void {
console.log('Hello,I am a student');
}
}
2.6.3、多態(tài)
多態(tài)是面相對(duì)象編程中的一個(gè)重要概念,它可以使同一類型的對(duì)象具有不同的行為。下面我們通過(guò)一個(gè)具體的案例來(lái)體會(huì)多態(tài)這一概念
首先,再創(chuàng)建一個(gè)Person
接口的實(shí)現(xiàn)類Teacher
,如下
class Teacher implements Person {
id: number;
name: string;
age: number;
constructor(id: number, name: string, age: number) {
this.id = id;
this.name = name;
this.age = age;
}
introduce(): void {
console.log('Hello,I am a teacher');
}
}
然后分別創(chuàng)建一個(gè)Student
對(duì)象和一個(gè)Teacher
對(duì)象,注意兩個(gè)對(duì)象的類型均可以設(shè)置Person
,如下
let p1: Person = new Student(1, 'zhangsan', 17);
let p2: Person = new Teacher(2, 'lisi', 35);
最后分別調(diào)用p1
和p2
的introduce()
方法,你會(huì)發(fā)現(xiàn),同樣是Person
類型的兩個(gè)對(duì)象,調(diào)用同一個(gè)introduce()
方法時(shí),表現(xiàn)出了不同的行為,這就是多態(tài)。
p1.introduce();//Hello,I am a student
p2.introduce();//Hello,I am a teacher
2.6.4、接口的作用
在傳統(tǒng)的面向?qū)ο缶幊痰膱?chǎng)景中,接口主要用于設(shè)計(jì)和組織代碼,使代碼更加容易擴(kuò)展和維護(hù)。
假如現(xiàn)在需要實(shí)現(xiàn)一個(gè)訂單支付系統(tǒng),按照面向?qū)ο缶幊痰牧?xí)慣,首先需要定義一個(gè)訂單類(Order),如下
class Order {
totalAmount: number;
constructor(totalAmount: number) {
this.totalAmount = totalAmount;
}
pay() {
console.log(`AliPay:${this.totalAmount}`);
}
}
很容易預(yù)想到,這個(gè)系統(tǒng)將來(lái)可能需要支持其他的支付方式,為了方便代碼支持新的支付方式,我們可以對(duì)代碼進(jìn)行如下改造。
首先定義一個(gè)支付策略的接口,接口中聲明一個(gè)pay
方法,用來(lái)規(guī)范實(shí)現(xiàn)類必須實(shí)現(xiàn)支付邏輯。
interface PaymentStrategy {
pay(amount: number): void;
}
然后在訂單類中增加一個(gè)PaymentStrategy
的屬性,并且在訂單類中的pay
方法中調(diào)用PaymentStrategy
的pay
方法,如下
class Order {
totalAmount: number;
paymentStrategy: PaymentStrategy;
constructor(totalAmount: number, paymentStrategy: PaymentStrategy) {
this.totalAmount = totalAmount;
this.paymentStrategy = paymentStrategy;
}
pay() {
this.paymentStrategy.pay(this.totalAmount);
}
}
這樣改造完之后,就可以很容易的在不改變現(xiàn)有代碼的情況下,支持新的支付方式了。
比如現(xiàn)在需要支持AliPay
,那我們就可以創(chuàng)建AliPay
這個(gè)類(class)并實(shí)現(xiàn)(implement)PaymentStrategy
這個(gè)接口,如下
class AliPay implements PaymentStrategy {
pay(amount: number): void {
console.log(`AliPay:${amount}`);
}
}
這樣一來(lái),之后創(chuàng)建的訂單就可以使用AliPay
這個(gè)支付方式了。
let order = new Order(1000,new AliPay());
order.pay();
2.6.5、TS中接口的特殊性
TypeScript 中的接口是一個(gè)非常靈活的概念,除了用作類的規(guī)范之外,也常用于直接描述對(duì)象的類型,例如,現(xiàn)有一個(gè)變量的定義如下
let person: {name:string, age:number, gender:string} = {name:'張三', age:10, gender:'男'};
可以看到變量的值為一個(gè)一般對(duì)象,變量的類型為{name:string, age:number, gender:string}
,此時(shí)就可以聲明一個(gè)接口來(lái)描述該對(duì)象的類型,如下
interface Person {
name: string;
age: number;
gender: string;
}
let person: Person = {name:'張三', age:10, gender:'男'};
2.7、枚舉
2.7.1、枚舉介紹
枚舉(Enumeration)是編程語(yǔ)言中常見(jiàn)的一種數(shù)據(jù)類型,其主要功能是定義一組有限的選項(xiàng),例如,方向(上、下、左、右)或季節(jié)(春、夏、秋、冬)等概念都可以使用枚舉類型定義。
2.7.2、語(yǔ)法說(shuō)明
①枚舉定義
枚舉的定義需使用enum
關(guān)鍵字,如下
enum Season {
SPRING,
SUMMER,
AUTUMN,
WINTER
}
②枚舉使用
枚舉的使用記住兩個(gè)原則即可
- 枚舉值的訪問(wèn)
像訪問(wèn)對(duì)象屬性一樣訪問(wèn)枚舉值,例如
Season.SPRING
- 枚舉值的類型
枚舉值的類型為
enum
的名稱,例如Season.SPRING
和Season.SUMMER
等值的類型都是Season
let spring:Season = Season.SPRING;
③使用場(chǎng)景
現(xiàn)需要編寫一個(gè)函數(shù)move
,其功能是根據(jù)輸入的方向(上、下、左、右)進(jìn)行移動(dòng),此時(shí)就可以先使用枚舉定義好所有可能的輸入選項(xiàng),如下
enum Direction {
UP,
BOTTOM,
LEFT,
RIGHT
}
move
函數(shù)的實(shí)現(xiàn)如下
function move(direction: Direction) {
if(direction===Direction.UP){
console.log('向上移動(dòng)');
}else if(direction===Direction.BOTTOM){
console.log('向下移動(dòng)');
}else if(direction===Direction.LEFT){
console.log('向左移動(dòng)');
}else{
console.log('向右移動(dòng)');
}
}
move(Direction.UP);
2.7.3、賦值
在TypeScript 中,枚舉實(shí)際上是一個(gè)對(duì)象,而每個(gè)枚舉值都是該對(duì)象的一個(gè)屬性,并且每個(gè)屬性都有具體的值,屬性值只支持兩種類型——數(shù)字或字符串。
默認(rèn)情況下,每個(gè)屬性的值都是數(shù)字,并且從 0
開(kāi)始遞增,例如上述案例中的Direction
枚舉中,Direction.UP
的值為0
,Direction.BOTTOM
的值為1
,依次類推,具體如下
console.log(Direction.UP) //0
console.log(Direction.BOTTOM) //1
console.log(Direction.LEFT) //2
console.log(Direction.RIGHT) //3
除了使用默認(rèn)的數(shù)字作為屬性的值,我們還能手動(dòng)為每個(gè)屬性賦值,例如
enum Direction {
UP = 1,
BOTTOM = 2,
LEFT = 3,
RIGHT = 4
}
console.log(Direction.UP) //1
console.log(Direction.BOTTOM) //2
console.log(Direction.LEFT) //3
console.log(Direction.RIGHT) //4
再例如
enum Direction {
UP = 'up',
BOTTOM = 'bottom',
LEFT = 'left',
RIGHT = 'right'
}
console.log(Direction.UP) //up
console.log(Direction.BOTTOM) //bottom
console.log(Direction.LEFT) //left
console.log(Direction.RIGHT) //right
通過(guò)為枚舉屬性賦值,可以賦予枚舉屬性一些更有意義的信息,例如以下枚舉
enum Color {
Red = 0xFF0000,
Green = 0x00FF00,
Blue = 0x0000FF
}
enum FontSize {
Small = 12,
Medium = 16,
Large = 20,
ExtraLarge = 24
}
2.8、模塊化
2.8.1、模塊化介紹
模塊化是指將復(fù)雜的程序拆解為多個(gè)獨(dú)立的文件單元,每個(gè)文件被稱為一個(gè)模塊。在 TypeScript 中,默認(rèn)情況下,每個(gè)模塊都擁有自己的作用域,這意味著在一個(gè)模塊中聲明的任何內(nèi)容(如變量、函數(shù)、類等)在該模塊外部是不可見(jiàn)的。為了在一個(gè)模塊中使用其他模塊的內(nèi)容,必須對(duì)這些內(nèi)容進(jìn)行導(dǎo)入、導(dǎo)出。
2.8.2、語(yǔ)法說(shuō)明
①導(dǎo)出
導(dǎo)出須使用export
關(guān)鍵字,語(yǔ)法如下
export function hello() {
console.log('hello module A');
}
export const str = 'hello world';
const num = 1;
②導(dǎo)入
導(dǎo)入須使用import
關(guān)鍵字,語(yǔ)法如下
import { hello, str } from './moduleA';
hello();
console.log(str);
2.8.3、避免命名沖突
若多個(gè)模塊中具有命名相同的變量、函數(shù)等內(nèi)容,將這些內(nèi)容導(dǎo)入到同一模塊下就會(huì)出現(xiàn)命名沖突。例如,在上述案例的基礎(chǔ)上,又增加了一個(gè) moduleC,內(nèi)容如下
export function hello() {
console.log('hello module C');
}
export const str = 'module C';
moduleB 同時(shí)引入 moduleA 和 moduleC 的內(nèi)容,如下,顯然就會(huì)出命名沖突
import { hello, str } from "./moduleA";
import { hello, str } from "./moduleC";
hello() //?
console.log(str); //?
①導(dǎo)入重命名
import { hello as helloFromA, str as strFromA } from "./moduleA";
import { hello as helloFromC, str as strFromC } from "./moduleC";
helloFromA();
console.log(strFromA);
helloFromC();
console.log(strFromC);
②創(chuàng)建模塊對(duì)象
上述導(dǎo)入重命名的方式能夠很好的解決命名沖突的問(wèn)題,但是當(dāng)沖突內(nèi)容較多時(shí),這種寫法會(huì)比較冗長(zhǎng)。除了導(dǎo)入重命名外,還可以將某個(gè)模塊的內(nèi)容統(tǒng)一導(dǎo)入到一個(gè)模塊對(duì)象上,這樣就能簡(jiǎn)潔有效的解決命名沖突的問(wèn)題了,具體語(yǔ)法如下
import * as A from "./moduleA";
import * as C from "./moduleC";
A.hello();
console.log(A.str);
C.hello();
console.log(C.str);
2.8.4、默認(rèn)導(dǎo)入導(dǎo)出
①默認(rèn)導(dǎo)出
默認(rèn)導(dǎo)出允許一個(gè)模塊指定一個(gè)(最多一個(gè))默認(rèn)的導(dǎo)出項(xiàng),語(yǔ)法如下
export default function hello(){
console.log('moduleA');
}
②默認(rèn)導(dǎo)入
由于每個(gè)模塊最多有一個(gè)默認(rèn)導(dǎo)出,因此默認(rèn)導(dǎo)入無(wú)需關(guān)注導(dǎo)入項(xiàng)的原始名稱,并且無(wú)需使用{}
。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-825603.html
import helloFromA from "./moduleA";
由于默認(rèn)導(dǎo)入時(shí)無(wú)需關(guān)注導(dǎo)入項(xiàng)的名稱,所以默認(rèn)導(dǎo)出支持匿名內(nèi)容,比如匿名函數(shù),語(yǔ)法如下?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-825603.html
export default function () {
console.log('moduleB');
}
到了這里,關(guān)于【鴻蒙系統(tǒng)學(xué)習(xí)筆記】TypeScript開(kāi)發(fā)語(yǔ)言的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!