鸿蒙开发:ArkTs数据类型
前言 本文代码案例基于Api13。 数据类型,在开发中是最常见的,无论是哪一种语言,无时无刻不在与其打交道,它是编程语言中用于定义变量、函数返回值、数据结构等可以存储数据种类和范围的一种机制,它也是编程语言对内存中数据的抽象表示,正因为有了数据类型,才使得程序员能够以更加清晰和易于理解的方式编写代码,同时确保了数据的正确性和安全性。 无论是哪一种的编程语言,对于数据类型的表示可能有所区别,但也基本上可以分为两种类型,一种是基本数据类型,另一种是符合数据类型。 基本数据类型 在ArkTs中,用于表示基本数据类型的有两个,一个是number类型,另一个是布尔类型(Boolean)。 number类型:用于表示整数、浮点,它可以表示正数、负数或零,也可以表示单精度浮点和双精度浮点。 布尔类型(Boolean):用于表示逻辑上的真(True)和假(False)。布尔类型只有两个取值,通常用于条件判断和逻辑运算。 复合数据类型 复合数据类型,相对就比较多了,比如,字符串,数组,对象,枚举等等,具体如下: 字符串(String):字符的序列,用于表示文本数据。字符串中的字符可以是字母、数字、符号或空格等。 数组(Array):相同数据类型的元素的集合。数组中的元素可以通过索引(Index)来访问,索引通常是从0开始的整数。 类(Class):用于表示复杂的数据结构,可以包含多个不同类型的成员变量(属性)和成员函数(方法)。类在面向对象编程中非常重要。 联合(Union):允许在相同的内存位置存储不同类型的数据,但每次只能存储其中一种类型的数据。联合类型在嵌入式编程和系统级编程中较为常见。 枚举(Enum):为整数常量赋予友好的名字,使代码更加清晰和易于理解。枚举类型在定义一组有限的常量时非常有用。 函数类型:表示函数的签名,包括函数的返回类型和参数类型。函数类型在函数式编程和高级编程语言中较为常见。 需要注意的是,不同的编程语言可能支持不同的数据类型,并且相同的数据类型在不同编程语言中的实现和限制也可能有所不同,针对各个数据类型,我们一一进行概述。 数据类型汇总如下: 数据类型 概述 number 数值 boolean 布尔 string 字符串 void 没有任何返回值的类型 Object 对象 array 数组 enum 枚举 Union 联合类型 Aliases 匿名类型 undefined 一个未定义或不存在的值 null 空 never 永远不存在的类型 1、number类型 在ArkTs中,它没有像Java语言那么的严格,int是int,float是float,它涵盖的很大,任何整数和浮点数都可以被赋给此类型的变量,我们统称为数字字面量,而数字字面量又分为了整数字面量和十进制浮点数字面量。 整数字面量包括以下类别: 1、由数字序列组成的十进制整数。例如:6、88、-88 2、以0x(或0X)开头的十六进制整数,可以包含数字(0-9)和字母a-f或A-F。例如:0x22b8、0x00111、-0xF1A7 3、以0o(或0O)开头的八进制整数,只能包含数字(0-7)。例如:0o21270 4、以0b(或0B)开头的二进制整数,只能包含数字0和1。例如:0b10001010111000、0b0011、-0b11 浮点字面量包括以下: 1、十进制整数,可为有符号数(即,前缀为“+”或“-”); 2、小数点(“.”) 3、小数部分(由十进制数字字符串表示) 4、以“e”或“E”开头的指数部分,后跟有符号(即,前缀为“+”或“-”)或无符号整数。 代码示例: let a = 8 //整数 let b = 8.88 //浮点数 let c = -888 //负数 let d = 0x22b8 // 十六进制 let e = 0o21270 // 八进制 let f = 0b10001010111000 //二进制 let g = 8e2 有一个问题需要注意,number类型在表示大整数时会造成精度丢失,在开发时可以按需使用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类型的数据,是开发中最常见的,它代表字符序列,可以使用转义字符来表示字符,由于这一小节非常的重要,我们放到下章节中重点概述,当前,我们先基本的认识下string类型。 字符串字面量由单引号(')或双引号(")之间括起来的零个或多个字符组成。字符串字面量还有一特殊形式,是用反向单引号(`)括起来的模板字面量。 TypeScript let s1 = 'Hello, world!\n'; let s2 = 'this is a string'; let a = 'Success'; let s3 =The result is ${a}; 4、void类型 void类型用于指定函数没有返回值。 此类型只有一个值,同样也是void,由于void是引用类型,因此它可以用于泛型类型参数。 TypeScript class Class { //... } let instance: Class 5、Object类型 Object类型是所有引用类型的基类型,任何值,包括基本类型的值(它们会被自动装箱),都可以直接被赋给Object类型的变量。 TypeScript let a: Object = 8 //整数 let b: Object = true //布尔 let c: Object = "字符串" //字符串 但是,有一点需要注意,那就是小写的object和大写的Object是有区别的,那就是object类型主要用于表示除基本类型外的类型,如果把以上的代码,用object表示则会报异常。 6、array类型 array,即数组,也是非常重要的数据类型,再接下来的章节中,也会重点的讲述。 数组可由数组复合字面量(即用方括号括起来的零个或多个表达式的列表,其中每个表达式为数组中的一个元素)来赋值。数组的长度由数组中元素的个数来确定。数组中第一个元素的索引为0。 ArkTs中的数组比较特殊,如果你不确定相关类型,那么它的元素可以是多种类型的,如下代码,包含三个元素的数组。 TypeScript let value = ['字符串', 88, true] 在实际的开发中,为了类型的精确,建议大家还是直接设置相关类型: TypeScript let value:string[] = ['字符串', '字符串2', '字符串3'] 7、enum类型 enum类型,又称枚举类型,是预先定义的一组命名值的值类型,其中命名值又称为枚举常量。 使用枚举常量时必须以枚举类型名称为前缀。 TypeScript enum ColorSet { Red, Green, Blue } let c: ColorSet = ColorSet.Red 常量表达式可以用于显式设置枚举常量的值。 TypeScript enum ColorSet { White = 0xFF, Grey = 0x7F, Black = 0x00 } let c: ColorSet = ColorSet.Black 8、Union类型 union类型,即联合类型,是由多个类型组合成的引用类型,联合类型包含了变量可能的所有类型,这个在系统的Api中非常的常见,比如文字的大小参数就是一个联合类型。 代码示例: `TypeScript 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; // 可以将类型为联合类型的变量赋值为任何组成类型的有效值 ` 可以用不同的机制获取联合类型中特定类型的值。 示例: `TypeScript 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类型为匿名类型(数组、函数、对象字面量或联合类型)提供名称,或为已有类型提供替代名称。 TypeScript type Matrix = number[][]; type Handler = (s: string, no: number) => string; type Predicate = (x: T) => boolean; type NullableObject = Object | null; 10、未定义或不存在的值undefined 当你定义了一个变量而为赋值时,那么它就是undefined,虽然说,可以直接设置undefined类型,但是一般情况下undefined并非单独使用,原因就在于后续的赋值问题。 TypeScript let test:undefined 虽然说以上的代码不会出现问题,但是毫无意义,一般情况下,可以作为一个联合类型出现,如下代码: TypeScript let test: undefined | number test = 0 当然更多的则是在成员变量的使用上,如下所示,带问号,就意味着这个属性可以为undefined。 TypeScript test?:number 那么在以后的开发中,如果你不确定某个数据是否有值,无论对象还是其他类型,都可以进行undefined判断: TypeScript if (test != undefined) { console.log("有值") } else { console.log("无值") } 11、空null null是一个表示"空值"的对象

前言
本文代码案例基于Api13。
数据类型,在开发中是最常见的,无论是哪一种语言,无时无刻不在与其打交道,它是编程语言中用于定义变量、函数返回值、数据结构等可以存储数据种类和范围的一种机制,它也是编程语言对内存中数据的抽象表示,正因为有了数据类型,才使得程序员能够以更加清晰和易于理解的方式编写代码,同时确保了数据的正确性和安全性。
无论是哪一种的编程语言,对于数据类型的表示可能有所区别,但也基本上可以分为两种类型,一种是基本数据类型,另一种是符合数据类型。
基本数据类型
在ArkTs中,用于表示基本数据类型的有两个,一个是number类型,另一个是布尔类型(Boolean)。
number类型:用于表示整数、浮点,它可以表示正数、负数或零,也可以表示单精度浮点和双精度浮点。
布尔类型(Boolean):用于表示逻辑上的真(True)和假(False)。布尔类型只有两个取值,通常用于条件判断和逻辑运算。
复合数据类型
复合数据类型,相对就比较多了,比如,字符串,数组,对象,枚举等等,具体如下:
字符串(String):字符的序列,用于表示文本数据。字符串中的字符可以是字母、数字、符号或空格等。
数组(Array):相同数据类型的元素的集合。数组中的元素可以通过索引(Index)来访问,索引通常是从0开始的整数。
类(Class):用于表示复杂的数据结构,可以包含多个不同类型的成员变量(属性)和成员函数(方法)。类在面向对象编程中非常重要。
联合(Union):允许在相同的内存位置存储不同类型的数据,但每次只能存储其中一种类型的数据。联合类型在嵌入式编程和系统级编程中较为常见。
枚举(Enum):为整数常量赋予友好的名字,使代码更加清晰和易于理解。枚举类型在定义一组有限的常量时非常有用。
函数类型:表示函数的签名,包括函数的返回类型和参数类型。函数类型在函数式编程和高级编程语言中较为常见。
需要注意的是,不同的编程语言可能支持不同的数据类型,并且相同的数据类型在不同编程语言中的实现和限制也可能有所不同,针对各个数据类型,我们一一进行概述。
数据类型汇总如下:
数据类型 | 概述 |
---|---|
number | 数值 |
boolean | 布尔 |
string | 字符串 |
void | 没有任何返回值的类型 |
Object | 对象 |
array | 数组 |
enum | 枚举 |
Union | 联合类型 |
Aliases | 匿名类型 |
undefined | 一个未定义或不存在的值 |
null | 空 |
never | 永远不存在的类型 |
1、number类型
在ArkTs中,它没有像Java语言那么的严格,int是int,float是float,它涵盖的很大,任何整数和浮点数都可以被赋给此类型的变量,我们统称为数字字面量,而数字字面量又分为了整数字面量和十进制浮点数字面量。
整数字面量包括以下类别:
1、由数字序列组成的十进制整数。例如:6、88、-88
2、以0x(或0X)开头的十六进制整数,可以包含数字(0-9)和字母a-f或A-F。例如:0x22b8、0x00111、-0xF1A7
3、以0o(或0O)开头的八进制整数,只能包含数字(0-7)。例如:0o21270
4、以0b(或0B)开头的二进制整数,只能包含数字0和1。例如:0b10001010111000、0b0011、-0b11
浮点字面量包括以下:
1、十进制整数,可为有符号数(即,前缀为“+”或“-”);
2、小数点(“.”)
3、小数部分(由十进制数字字符串表示)
4、以“e”或“E”开头的指数部分,后跟有符号(即,前缀为“+”或“-”)或无符号整数。
代码示例:
let a = 8 //整数
let b = 8.88 //浮点数
let c = -888 //负数
let d = 0x22b8 // 十六进制
let e = 0o21270 // 八进制
let f = 0b10001010111000 //二进制
let g = 8e2
有一个问题需要注意,number类型在表示大整数时会造成精度丢失,在开发时可以按需使用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类型的数据,是开发中最常见的,它代表字符序列,可以使用转义字符来表示字符,由于这一小节非常的重要,我们放到下章节中重点概述,当前,我们先基本的认识下string类型。
字符串字面量由单引号(')或双引号(")之间括起来的零个或多个字符组成。字符串字面量还有一特殊形式,是用反向单引号(`)括起来的模板字面量。
TypeScript
The result is ${a}
let s1 = 'Hello, world!\n';
let s2 = 'this is a string';
let a = 'Success';
let s3 =;
4、void类型
void类型用于指定函数没有返回值。
此类型只有一个值,同样也是void,由于void是引用类型,因此它可以用于泛型类型参数。
TypeScript
class Class
//...
}
let instance: Class
5、Object类型
Object类型是所有引用类型的基类型,任何值,包括基本类型的值(它们会被自动装箱),都可以直接被赋给Object类型的变量。
TypeScript
let a: Object = 8 //整数
let b: Object = true //布尔
let c: Object = "字符串" //字符串
但是,有一点需要注意,那就是小写的object和大写的Object是有区别的,那就是object类型主要用于表示除基本类型外的类型,如果把以上的代码,用object表示则会报异常。
6、array类型
array,即数组,也是非常重要的数据类型,再接下来的章节中,也会重点的讲述。
数组可由数组复合字面量(即用方括号括起来的零个或多个表达式的列表,其中每个表达式为数组中的一个元素)来赋值。数组的长度由数组中元素的个数来确定。数组中第一个元素的索引为0。
ArkTs中的数组比较特殊,如果你不确定相关类型,那么它的元素可以是多种类型的,如下代码,包含三个元素的数组。
TypeScript
let value = ['字符串', 88, true]
在实际的开发中,为了类型的精确,建议大家还是直接设置相关类型:
TypeScript
let value:string[] = ['字符串', '字符串2', '字符串3']
7、enum类型
enum类型,又称枚举类型,是预先定义的一组命名值的值类型,其中命名值又称为枚举常量。
使用枚举常量时必须以枚举类型名称为前缀。
TypeScript
enum ColorSet {
Red, Green, Blue
}
let c: ColorSet = ColorSet.Red
常量表达式可以用于显式设置枚举常量的值。
TypeScript
enum ColorSet {
White = 0xFF, Grey = 0x7F, Black = 0x00
}
let c: ColorSet = ColorSet.Black
8、Union类型
union类型,即联合类型,是由多个类型组合成的引用类型,联合类型包含了变量可能的所有类型,这个在系统的Api中非常的常见,比如文字的大小参数就是一个联合类型。
代码示例:
`TypeScript
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;
// 可以将类型为联合类型的变量赋值为任何组成类型的有效值
`
可以用不同的机制获取联合类型中特定类型的值。
示例:
`TypeScript
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类型为匿名类型(数组、函数、对象字面量或联合类型)提供名称,或为已有类型提供替代名称。
TypeScript
type Matrix = number[][];
type Handler = (s: string, no: number) => string;
type Predicate
type NullableObject = Object | null;
10、未定义或不存在的值undefined
当你定义了一个变量而为赋值时,那么它就是undefined,虽然说,可以直接设置undefined类型,但是一般情况下undefined并非单独使用,原因就在于后续的赋值问题。
TypeScript
let test:undefined
虽然说以上的代码不会出现问题,但是毫无意义,一般情况下,可以作为一个联合类型出现,如下代码:
TypeScript
let test: undefined | number
test = 0
当然更多的则是在成员变量的使用上,如下所示,带问号,就意味着这个属性可以为undefined。
TypeScript
test?:number
那么在以后的开发中,如果你不确定某个数据是否有值,无论对象还是其他类型,都可以进行undefined判断:
TypeScript
if (test != undefined) {
console.log("有值")
} else {
console.log("无值")
}
11、空null
null是一个表示"空值"的对象,通常用来表示变量的值为“没有值”,如果需要明确表示一个变量的值为空,就可以使用 null,和undefined的使用方式类似,一般不直接进行使用,可以结合其它类型进行联合使用。
`TypeScript
let test: null | number
test = 0
`
除了变量的默认值赋值为null之外, 还可以用来作为函数的返回值,当函数没有需要返回的值时,可以使用 return null,表示函数的返回值为空。
null和undefined进行比较
1、null 表示对象为空,而 undefined 表示缺少值。
2、声明变量但未赋值时,变量的值为 undefined,当需要表示空值时,可以使用 null。
3、在比较时,null 和 undefined 的值相等,但数据类型不同。
12、永远不存在的类型never
never类型在开发中很少会遇到,它是任何类型的子类型,可以赋值给任何类型,但是,有一点需要知道,never是没有子类型的。
never类型一般是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型,如下举例所示:
`TypeScript
// 抛出异常
error(message: string): never {
throw new Error(message);
}
//无返回值
infiniteLoop(): never {
while (true) {
}
}
`
小结
无论是哪一种类型,如果是成员变量,在没有默认值的情况下,需要加类型和问号,如下代码所示:
TypeScript
test?: number
还有一点是比较好的,那就是,ArkTs和也具有类型推断功能,类型可以不写也不会报错,为了避免冗余,日后的书写也建议舍弃类型,前提是有默认值的情况下。
TypeScript
let test = 0
有些场景下,特别是联合类型的时候,我们需要判断当前的属性是哪一个类型,我们可以通过typeof关键字来判断,举例如下:
TypeScript
let a = 1
let type = typeof a
最后一点是,ArkTS不支持any和unknown类型,需要显式指定具体类型,否则会报异常,具体原因是,这是ArkTS的特性之一,那就是使用静态类型;如果程序采用静态类型,即所有类型在编译时都是已知的,那么开发者就能够容易理解代码中使用了哪些数据结构。同时,由于所有类型在程序实际运行前都是已知的,编译器可以提前验证代码的正确性,从而可以减少运行时的类型检查,有助于提升性能。