在 ArkTS 的编程世界里,对数据类型的理解是构建稳健和高效程序的关键。本文将深入探讨 ArkTS 中多种重要的数据类型,包括它们的定义、用法以及一些需要注意的细节。

一、Number 类型

ArkTS 提供了 number 和 Number 类型,这使得任何整数和浮点数都能被赋给此类型的变量。数字字面量丰富多样,涵盖了多种形式。

(一)整数字面量

  1. 十进制整数
    • 由简单的数字序列组成,例如:0117-345。这是我们最常见的整数表示形式,在日常的计数和基本运算场景中广泛应用。
  2. 十六进制整数
    • 以 0x(或 0X)开头,其中可以包含数字(0 - 9)和字母 a - f 或 A - F。像 0x11230x00111-0xF1A7 这样的十六进制数在处理与内存地址、颜色值(在某些系统中)等相关的场景中非常有用。例如,在图形处理中,颜色值常常以十六进制形式表示,这种表示方式可以更紧凑地存储和操作颜色信息。
  3. 八进制整数
    • 以 0o(或 0O)开头,且只能包含数字(0 - 7)。比如 0o777。虽然八进制在现代编程中的使用场景相对较少,但在一些特定的历史遗留系统或特定领域的应用中仍可能会遇到。
  4. 二进制整数
    • 以 0b(或 0B)开头,只能包含数字 0 和 1,如 0b110b0011-0b11。二进制数在底层的计算机系统操作、位运算以及一些涉及到硬件交互的编程场景中具有重要意义,因为计算机的底层存储和运算都是基于二进制的。

(二)浮点字面量

  1. 组成部分
    • 十进制整数部分,可以是有符号数(即前缀为 “+” 或 “-”)。
    • 小数点(“.”),用于分隔整数部分和小数部分。
    • 小数部分,由十进制数字字符串表示。
    • 指数部分,以 “e” 或 “E” 开头,后跟有符号(即前缀为 “+” 或 “-”)或无符号整数。例如,2.21.23 是常见的浮点数字面量形式,而像 1e2 这种科学计数法形式的浮点数字面量在表示非常大或非常小的数时非常方便,在科学计算、工程计算等领域广泛应用。

以下是一些使用 number 类型的示例:

let num1 = 2.2;
let num2 = 1.23;
let num3 = 2;
let num4 = 1e2;

function factorial(n: number): number{
  if (n <= 1) {
    return 1;
  }
  return n * factorial(n - 1); // 这里修正了递归调用的参数,避免无限递归
}

factorial(num1);
factorial(num2);
factorial(num3);
factorial(num4);

二、Boolean 类型

Boolean 类型由 true 和 false 两个逻辑值组成,它在条件语句中扮演着核心角色。通过使用 Boolean 类型的变量,我们可以根据不同的条件来控制程序的执行流程。例如:

let isTrue: boolean = true;

if (isTrue){
  console.log("this true!");
}

在这个简单的示例中,当 isTrue 为 true 时,会执行 console.log 语句。这种基于布尔值的条件判断是编程中实现逻辑分支的基础,广泛应用于各种算法和程序逻辑中。

三、String 类型

string 代表字符序列,在 ArkTS 中可以使用转义字符来表示特殊字符。字符串字面量有两种常见的形式:一种是由单引号('')或双引号("")之间括起来的零个或多个字符组成,另一种特殊形式是用方向单引号(``)括起来的模板字面量。

例如:

let str1 = 'holle';
let str2 = 'string Text';
let str3 = 'true';
let str4 = `this is ${str3}`;

这里的模板字面量 ${str3} 允许我们在字符串中嵌入变量的值,这种特性在构建动态生成的字符串时非常有用。比如在生成用户个性化的消息、动态构建 SQL 查询语句(虽然在实际应用中要注意安全问题)等场景中,模板字面量可以使代码更加简洁和易读。

四、Void 类型

void 类型用于指定函数没有返回值。它只有一个值,就是 void 本身。由于 void 是引用类型,因此它可以用在泛型类型参数中。例如:

class Class<T>{
  // 这里可以是类的具体实现,省略部分代码
}
let instance: Class <void>

在函数定义中,如果一个函数不返回任何实际的值,就可以将其返回类型指定为 void。这有助于明确函数的行为,增强代码的可读性和可维护性,特别是在大型项目中,清晰的函数返回类型定义可以让其他开发者更容易理解函数的功能。

五、Object 类型

Object 类型是所有引用类型的基类型。这意味着任何值,包括基本类型的值(它们会被自动装箱),都可以直接被赋给 Object 类型的变量。这种特性使得 Object 类型在处理不确定类型的值或者在一些通用的编程场景中非常有用,例如在创建通用的数据存储结构或者处理动态类型的数据时。

六、Array 类型

array,即数组,是由可赋值给数组声明中指定的元素的数据组成的对象。数组可以通过数组复合字面量(即用方括号括起来的零个或多个表达式的列表,其中每个表达式为数组中的一个元素)来赋值,数组的长度由数组中元素的个数来确定,且数组中第一个元素的索引为 0。例如:

let arr: string[] = ['aaa','bbb','ccc'];

console.log(arr[2]);

数组是编程中处理一组相关数据的重要工具。我们可以通过索引访问数组中的元素,对数组进行遍历、排序、搜索等操作。在处理列表数据、数据集合等场景中,数组是不可或缺的。

七、Enum 类型

enum 类型,又称枚举类型,是预先定义的一组命名值的值类型,其中命名值又称为枚举常量。使用枚举常量时必须以枚举类型名称为前缀。例如:

enum ColorSet {Red,Green,Blue}
let c: ColorSet = ColorSet.Red;

// 常量表达式可以用于显示设置枚举常量的值
enum ColorSet {White = 0xFF,Gret = 0x7F,Black = 0X00}
let co: ColorSet = ColorSet.Blue;

枚举类型在需要定义一组有限的、具有明确含义的常量值时非常有用。比如在表示一周的天数、颜色种类、方向(东、南、西、北)等场景中,使用枚举可以提高代码的可读性和可维护性,避免使用魔法数字或字符串,使代码的逻辑更加清晰。

八、Union 类型

union 类型是由多个类型组合成的引用类型,它包含了变量可能的所有类型。例如:

class A {
  name: string = 'A';
}

class B {
  name: string = 'B';
}

class C {
  name: string = 'C';
}

type ziMu = A | B | C
// 字母有 A,B,C这些类(也可是接口)

let zi: ziMu = new C();
zi = new A();
// @ts-ignore   通过添加 @ts-ignore,是告诉编译器暂时忽略这次类型不匹配的错误,继续执行代码。
zi = 'aa'; // 这里虽然可以通过编译指令忽略错误,但实际开发中应避免这种类型不匹配的情况,因为可能导致运行时问题
// 可以将类型为联合类型的变量赋值为任何组成类型的有效值

// 可以用不同的机制获取联合类型中特定类型的值
class D { demoD(){};testD(){}}
class E { demoE(){};testE(){}}
class F { demoF(){};testF(){}}

type ab = D | E | F;

function foo(ab: ab) {
  if (ab instanceof D) {
    ab.demoD(); // ab 在这里是 D 类型
  }
  // @ts-ignore
  ab.testD(); // 这里存在类型错误,只有当 ab 是 D 类型时才有 testD 方法,这种忽略错误的方式可能导致问题,应谨慎使用
}

联合类型在处理具有多种可能类型的值时非常方便,但在使用过程中需要注意类型的正确性,避免引入潜在的错误。

九、Aliases 类型

Aliases 类型为匿名类型(数组、函数、对象字面量或联合类型)提供名称,或为已有类型提供代替名称。例如:

type M = number[][];
type sss = (s: string,no: number) => string;
type pppp <T> = (x: T) => boolean;
type ObjectD = Object | null;

通过使用类型别名,我们可以使复杂的类型定义更加简洁和易读,提高代码的可维护性。特别是在处理复杂的函数类型、嵌套的数组类型或者联合类型时,类型别名可以让代码的类型结构更加清晰。

希望通过对 ArkTS 这些数据类型的详细讲解,能帮助读者更好地理解和运用 ArkTS 进行编程,写出更加健壮和高效的代码。在实际开发中,深入理解数据类型的特性和用法是解决各种编程问题的关键所在。

请注意,在代码示例中,对于一些可能导致类型错误的情况(如使用 @ts-ignore 跳过类型检查)进行了强调,因为在规范的编程中,应尽量避免这种可能引发运行时问题的操作。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐