前言
本文代碼案例基于Api13。
數(shù)據(jù)類型,在開發(fā)中是最常見的,無論是哪一種語言,無時無刻不在與其打交道,它是編程語言中用于定義變量、函數(shù)返回值、數(shù)據(jù)結構等可以存儲數(shù)據(jù)種類和范圍的一種機制,它也是編程語言對內存中數(shù)據(jù)的抽象表示,正因為有了數(shù)據(jù)類型,才使得程序員能夠以更加清晰和易于理解的方式編寫代碼,同時確保了數(shù)據(jù)的正確性和安全性。
無論是哪一種的編程語言,對于數(shù)據(jù)類型的表示可能有所區(qū)別,但也基本上可以分為兩種類型,一種是基本數(shù)據(jù)類型,另一種是符合數(shù)據(jù)類型。
基本數(shù)據(jù)類型
在ArkTs中,用于表示基本數(shù)據(jù)類型的有兩個,一個是number類型,另一個是布爾類型(Boolean)。
number類型:用于表示整數(shù)、浮點,它可以表示正數(shù)、負數(shù)或零,也可以表示單精度浮點和雙精度浮點。
布爾類型(Boolean):用于表示邏輯上的真(True)和假(False)。布爾類型只有兩個取值,通常用于條件判斷和邏輯運算。
復合數(shù)據(jù)類型
復合數(shù)據(jù)類型,相對就比較多了,比如,字符串,數(shù)組,對象,枚舉等等,具體如下:
字符串(String):字符的序列,用于表示文本數(shù)據(jù)。字符串中的字符可以是字母、數(shù)字、符號或空格等。
數(shù)組(Array):相同數(shù)據(jù)類型的元素的集合。數(shù)組中的元素可以通過索引(Index)來訪問,索引通常是從0開始的整數(shù)。
類(Class):用于表示復雜的數(shù)據(jù)結構,可以包含多個不同類型的成員變量(屬性)和成員函數(shù)(方法)。類在面向對象編程中非常重要。
聯(lián)合(Union):允許在相同的內存位置存儲不同類型的數(shù)據(jù),但每次只能存儲其中一種類型的數(shù)據(jù)。聯(lián)合類型在嵌入式編程和系統(tǒng)級編程中較為常見。
枚舉(Enum):為整數(shù)常量賦予友好的名字,使代碼更加清晰和易于理解。枚舉類型在定義一組有限的常量時非常有用。
函數(shù)類型:表示函數(shù)的簽名,包括函數(shù)的返回類型和參數(shù)類型。函數(shù)類型在函數(shù)式編程和高級編程語言中較為常見。
需要注意的是,不同的編程語言可能支持不同的數(shù)據(jù)類型,并且相同的數(shù)據(jù)類型在不同編程語言中的實現(xiàn)和限制也可能有所不同,針對各個數(shù)據(jù)類型,我們一一進行概述。
數(shù)據(jù)類型匯總如下:
| 數(shù)據(jù)類型 | 概述 |
|---|---|
| number | 數(shù)值 |
| boolean | 布爾 |
| string | 字符串 |
| void | 沒有任何返回值的類型 |
| Object | 對象 |
| array | 數(shù)組 |
| enum | 枚舉 |
| Union | 聯(lián)合類型 |
| Aliases | 匿名類型 |
| undefined | 一個未定義或不存在的值 |
| null | 空 |
| never | 永遠不存在的類型 |
1、number類型
在ArkTs中,它沒有像Java語言那么的嚴格,int是int,float是float,它涵蓋的很大,任何整數(shù)和浮點數(shù)都可以被賦給此類型的變量,我們統(tǒng)稱為數(shù)字字面量,而數(shù)字字面量又分為了整數(shù)字面量和十進制浮點數(shù)字面量。
整數(shù)字面量包括以下類別:
1、由數(shù)字序列組成的十進制整數(shù)。例如:6、88、-88
2、以0x(或0X)開頭的十六進制整數(shù),可以包含數(shù)字(0-9)和字母a-f或A-F。例如:0x22b8、0x00111、-0xF1A7
3、以0o(或0O)開頭的八進制整數(shù),只能包含數(shù)字(0-7)。例如:0o21270
4、以0b(或0B)開頭的二進制整數(shù),只能包含數(shù)字0和1。例如:0b10001010111000、0b0011、-0b11
浮點字面量包括以下:
1、十進制整數(shù),可為有符號數(shù)(即,前綴為“+”或“-”);
2、小數(shù)點(“.”)
3、小數(shù)部分(由十進制數(shù)字字符串表示)
4、以“e”或“E”開頭的指數(shù)部分,后跟有符號(即,前綴為“+”或“-”)或無符號整數(shù)。
代碼示例:
let a = 8 //整數(shù)
let b = 8.88 //浮點數(shù)
let c = -888 //負數(shù)
let d = 0x22b8 // 十六進制
let e = 0o21270 // 八進制
let f = 0b10001010111000 //二進制
let g = 8e2
有一個問題需要注意,number類型在表示大整數(shù)時會造成精度丟失,在開發(fā)時可以按需使用bigInt類型來確保精度:
let bigInt: BigInt = BigInt('88888888888888888888888888888888888888888888888')
console.log("bigInt:" + bigInt.toString())
2、boolean類型
表示邏輯值 true 或 false,主要用于條件判斷。
代碼示例:
let isCompleted: boolean = false
if (isCompleted) {
console.log ('Completed')
}
3、string類型
string類型的數(shù)據(jù),是開發(fā)中最常見的,它代表字符序列,可以使用轉義字符來表示字符,由于這一小節(jié)非常的重要,我們放到下章節(jié)中重點概述,當前,我們先基本的認識下string類型。
字符串字面量由單引號(')或雙引號(")之間括起來的零個或多個字符組成。字符串字面量還有一特殊形式,是用反向單引號(`)括起來的模板字面量。
let s1 = 'Hello, world!\n';
let s2 = 'this is a string';
let a = 'Success';
let s3 = `The result is ${a}`;
4、void類型
void類型用于指定函數(shù)沒有返回值。
此類型只有一個值,同樣也是void,由于void是引用類型,因此它可以用于泛型類型參數(shù)。
class Class<T> {
//...
}
let instance: Class <void>
5、Object類型
Object類型是所有引用類型的基類型,任何值,包括基本類型的值(它們會被自動裝箱),都可以直接被賦給Object類型的變量。
let a: Object = 8 //整數(shù)
let b: Object = true //布爾
let c: Object = "字符串" //字符串
但是,有一點需要注意,那就是小寫的object和大寫的Object是有區(qū)別的,那就是object類型主要用于表示除基本類型外的類型,如果把以上的代碼,用object表示則會報異常。

6、array類型
array,即數(shù)組,也是非常重要的數(shù)據(jù)類型,再接下來的章節(jié)中,也會重點的講述。
數(shù)組可由數(shù)組復合字面量(即用方括號括起來的零個或多個表達式的列表,其中每個表達式為數(shù)組中的一個元素)來賦值。數(shù)組的長度由數(shù)組中元素的個數(shù)來確定。數(shù)組中第一個元素的索引為0。
ArkTs中的數(shù)組比較特殊,如果你不確定相關類型,那么它的元素可以是多種類型的,如下代碼,包含三個元素的數(shù)組。
let value = ['字符串', 88, true]
在實際的開發(fā)中,為了類型的精確,建議大家還是直接設置相關類型:
let value:string[] = ['字符串', '字符串2', '字符串3']
7、enum類型
enum類型,又稱枚舉類型,是預先定義的一組命名值的值類型,其中命名值又稱為枚舉常量。
使用枚舉常量時必須以枚舉類型名稱為前綴。
enum ColorSet {
Red, Green, Blue
}
let c: ColorSet = ColorSet.Red
常量表達式可以用于顯式設置枚舉常量的值。
enum ColorSet {
White = 0xFF, Grey = 0x7F, Black = 0x00
}
let c: ColorSet = ColorSet.Black
8、Union類型
union類型,即聯(lián)合類型,是由多個類型組合成的引用類型,聯(lián)合類型包含了變量可能的所有類型,這個在系統(tǒng)的Api中非常的常見,比如文字的大小參數(shù)就是一個聯(lián)合類型。

代碼示例:
class Cat {
name: string = 'cat';
// ...
}
class Dog {
name: string = 'dog';
// ...
}
class Frog {
name: string = 'frog';
// ...
}
type Animal = Cat | Dog | Frog | number
// Cat、Dog、Frog是一些類型(類或接口)
let animal: Animal = new Cat()
animal = new Frog()
animal = 42;
// 可以將類型為聯(lián)合類型的變量賦值為任何組成類型的有效值
可以用不同的機制獲取聯(lián)合類型中特定類型的值。
示例:
class Cat {
sleep () {
}
meow () {
}
}
class Dog {
sleep () {
}
bark () {
}
}
class Frog {
sleep () {
}
leap () {
}
}
type Animal = Cat | Dog | Frog;
function foo(animal: Animal) {
if (animal instanceof Frog) {
animal.leap() // animal在這里是Frog類型
}
animal.sleep() // Animal具有sleep方法
}
9、Aliases類型
Aliases類型為匿名類型(數(shù)組、函數(shù)、對象字面量或聯(lián)合類型)提供名稱,或為已有類型提供替代名稱。
type Matrix = number[][];
type Handler = (s: string, no: number) => string;
type Predicate <T> = (x: T) => boolean;
type NullableObject = Object | null;
10、未定義或不存在的值undefined
當你定義了一個變量而為賦值時,那么它就是undefined,雖然說,可以直接設置undefined類型,但是一般情況下undefined并非單獨使用,原因就在于后續(xù)的賦值問題。
let test:undefined
雖然說以上的代碼不會出現(xiàn)問題,但是毫無意義,一般情況下,可以作為一個聯(lián)合類型出現(xiàn),如下代碼:
let test: undefined | number
test = 0
當然更多的則是在成員變量的使用上,如下所示,帶問號,就意味著這個屬性可以為undefined。
test?:number
那么在以后的開發(fā)中,如果你不確定某個數(shù)據(jù)是否有值,無論對象還是其他類型,都可以進行undefined判斷:
if (test != undefined) {
console.log("有值")
} else {
console.log("無值")
}
11、空null
null是一個表示"空值"的對象,通常用來表示變量的值為“沒有值”,如果需要明確表示一個變量的值為空,就可以使用 null,和undefined的使用方式類似,一般不直接進行使用,可以結合其它類型進行聯(lián)合使用。
let test: null | number
test = 0
除了變量的默認值賦值為null之外, 還可以用來作為函數(shù)的返回值,當函數(shù)沒有需要返回的值時,可以使用 return null,表示函數(shù)的返回值為空。
null和undefined進行比較
1、null 表示對象為空,而 undefined 表示缺少值。
2、聲明變量但未賦值時,變量的值為 undefined,當需要表示空值時,可以使用 null。
3、在比較時,null 和 undefined 的值相等,但數(shù)據(jù)類型不同。
12、永遠不存在的類型never
never類型在開發(fā)中很少會遇到,它是任何類型的子類型,可以賦值給任何類型,但是,有一點需要知道,never是沒有子類型的。
never類型一般是那些總是會拋出異?;蚋揪筒粫蟹祷刂档暮瘮?shù)表達式或箭頭函數(shù)表達式的返回值類型,如下舉例所示:
// 拋出異常
error(message: string): never {
throw new Error(message);
}
//無返回值
infiniteLoop(): never {
while (true) {
}
}
小結
無論是哪一種類型,如果是成員變量,在沒有默認值的情況下,需要加類型和問號,如下代碼所示:
test?: number
還有一點是比較好的,那就是,ArkTs和也具有類型推斷功能,類型可以不寫也不會報錯,為了避免冗余,日后的書寫也建議舍棄類型,前提是有默認值的情況下。
let test = 0
有些場景下,特別是聯(lián)合類型的時候,我們需要判斷當前的屬性是哪一個類型,我們可以通過typeof關鍵字來判斷,舉例如下:
let a = 1
let type = typeof a
最后一點是,ArkTS不支持any和unknown類型,需要顯式指定具體類型,否則會報異常,具體原因是,這是ArkTS的特性之一,那就是使用靜態(tài)類型;如果程序采用靜態(tài)類型,即所有類型在編譯時都是已知的,那么開發(fā)者就能夠容易理解代碼中使用了哪些數(shù)據(jù)結構。同時,由于所有類型在程序實際運行前都是已知的,編譯器可以提前驗證代碼的正確性,從而可以減少運行時的類型檢查,有助于提升性能。