很多时候前面学了一直不用就容易遗忘,这里也是跟自己做个复习。

因为本文基于开发文档撰写而成,对很多地方我添加了足够注释,很适合新手直接学习该语言(需要有一定TS基础),也适合复习。


认识ArkTS

一、什么是ArkTS

ArkTS继承TypeScript语法。

  1. TypeScript是在JavaScript基础上通过添加类型定义扩展而来的,ArkTS则是TypeScript的进一步扩展。
  2. ArkTS语言设计中考虑了与TypeScript和JavaScript的互通性。ArkTS提供与TypeScript和JavaScript的无缝互通,可以轻松集成TypeScript和JavaScript代码到应用中,充分利用现有代码和库进行ArkTS开发。

二、编译器

DevEco Studio集成开发环境

DevEco Studio 是 HarmonyOS 应用及服务的集成开发环境(IDE),提供了一站式的开发平台,包括代码编辑、编译构建、代码调试、性能调优、模拟器、应用测试等能力。

(点击直接下载即可)

注:DevEco Studio开发环境依赖于网络环境,需要连接上网络才能确保工具的正常使用。


基本语法——声明篇

声明

ArkTS通过声明引入变量、常量、类型和函数。

变量声明

使用关键字let声明的变量可以在程序执行期间具有不同的值。

let zb: string = 'guanzhu';
zb = 'guanzhu,wo';
  1. 声明一个字符串类型的变量zb,并初始化为字符串'guanzhu'。这是变量zb的初始赋值。
  2. 将变量hi的值重新赋值为字符串'guanzhu,wo'。这展示了如何更新变量的值,从'guanzhu'变为'guanzhu,wo'

常量声明

使用关键字const声明的只读常量只能被赋值一次。

const hello: string = 'hello';

这段代码定义了一个字符串类型的常量变量hello,并将其初始化为字符串值'hello'。常量在程序执行过程中其值不可更改。

  1. 定义常量:使用const关键字定义一个名为hello的常量变量。
  2. 指定类型:通过: string指定hello变量的类型为字符串类型。
  3. 初始化值:将hello变量的初始值设置为字符串'hello'

这段代码的主要功能是声明并初始化一个字符串类型的常量,确保其在程序中作为不可变的标识符使用。

对常量重新赋值会造成编译时错误。

自动类型推断

如果变量或常量的声明包含初始值,开发者无需显式指定类型,因为ArkTS规范已列举了所有允许自动推断类型的场景。

以下示例中,两条声明语句都是有效的,两个变量都是string类型:

let z1: string = 'hello';
let z2 = 'hello, world';

这段代码主要展示了ArkTS语言中的变量声明和类型推断。通过声明两个变量hi1hi2,演示了如何使用显式类型声明和隐式类型推断来初始化字符串类型的变量。

  1. 声明变量 z2 并显式指定类型为string,初始化为字符串'hello'。这展示了如何在ArkTS中显式声明变量的类型。
  2. 声明变量 z2 并未显式指定类型,但根据初始化值'hello, world',ArkTS自动推断出变量hi2的类型为string。这展示了ArkTS的类型推断能力,即在没有显式类型声明的情况下,根据初始化值自动确定变量的类型。

类型

基本类型和引用类型

基本数据类型包括number、string等简单类型,它们可以准确地表示单一的数据类型。基

number类型

ArkTS提供number类型,任何整数和浮点数都可以被赋给此类型的变量。

数字字面量包括整数字面量十进制浮点数字面量

整数字面量包括以下类别:

  • 十进制整数,由数字序列组成。例如:1,0,-1。
  • 十六进制整数,以0x(或0X)开头,包含数字(0-9)和字母a-f或A-F。
  • 八进制整数,以0o(或0O)开头,只能包含数字(0-7)。
  • 二进制整数,以0b(或0B)开头,只能包含数字0和1。

浮点数字面量包括以下部分:

  • 十进制整数,可为有符号数(前缀为“+”或“-”)。
  • 小数点(“.”)。
  • 小数部分(由十进制数字字符串表示)。
  • 指数部分,以“e”或“E”开头,后跟有符号(前缀为“+”或“-”)或无符号整数。

number类型在表示大整数(即超过-9007199254740991~9007199254740991)时会造成精度丢失。

(例如在 JavaScript 中,当数字超过 Number.MAX_SAFE_INTEGER(即 9007199254740991)时,确实会出现精度丢失的问题。既然ArkTS是继承自TS,TS又继承自JS,那么继承了这个也是合理的)

boolean类型

boolean类型由true和false两个逻辑值组成。

string类型

string类型代表字符序列,可以使用转义字符来表示字符。

字符串字面量由单引号(')或双引号(")之间括起来的零个或多个字符组成。字符串字面量还有一特殊形式,是用反向单引号(`)括起来的模板字面量。

let z1 = 'Hello, world!\n';
let z2 = "this is a string";
let s = '关注';
let z3 = `The result is ${a}`;

这段代码主要展示了如何在ArkTS中创建和使用字符串。它定义了三个字符串变量,并使用模板字符串进行变量嵌入,以实现动态字符串的创建。

  1. 定义变量z1,并赋值为多行字符串,其中包含换行符\n,用于输出带有换行效果的字符串。
  2. 定义变量z2,并赋值为普通字符串,用于存储一段文字信息。
  3. 定义变量s,并赋值为字符串'关注',作为后续模板字符串中嵌入的变量。
  4. 定义变量z3,使用模板字符串语法,将变量a嵌入到字符串中,实现动态生成字符串的功能。

void类型

void类型用于指定函数没有返回值。

此类型只有一个值,同样是void。由于void是引用类型,因此它可以用于泛型类型参数。

Object类型

Object类型是所有引用类型的基类型。任何值,包括基本类型的值,都可以直接被赋给Object类型的变量(基本类型值会被自动装箱)。Object类型用于表示除基本类型外的类型。

array类型

array类型,即数组,是由可赋值给数组声明中指定的元素类型的数据组成的对象。

数组可由数组复合字面量赋值。数组复合字面量是用方括号括起来的零个或多个表达式列表,每个表达式为数组中的一个元素。数组的长度由数组中元素的个数确定。数组中第一个元素的索引为0。

let names: string[] = ['点赞', '收藏', '关注'];

该代码声明了一个名为names的数组变量,并初始化为包含三个字符串元素的数组,分别是'点赞', '收藏', '关注'。

  1. 使用let关键字声明一个名为names的变量。
  2. 变量类型被指定为string[],表示该变量是一个字符串数组。
  3. 变量names被初始化为一个包含三个字符串元素的数组:'点赞', '收藏', '关注'。

enum类型

enum类型,即枚举类型,是预先定义的一组命名值的值类型,其中命名值又称为枚举常量。

1.使用枚举常量时必须以枚举类型名称为前缀。

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

这段代码定义了一个枚举类型 ColorSet,并声明了一个变量 c,初始化为枚举类型 ColorSet的成员 Red。枚举类型 ColorSet包含三个成员:RedGreen和 Blue,用于表示不同的颜色。

  1. 定义枚举类型 ColorSet

    • 使用 enum关键字定义了一个枚举类型 ColorSet,其中包含三个成员:RedGreen和 Blue。枚举类型用于定义一组相关的值,这里用于表示颜色。
  2. 声明并初始化变量 c

    • 使用 let关键字声明一个变量 c
    • 将变量 c初始化为枚举类型 ColorSet的成员 Red。这意味着 c的值被设置为 ColorSet.Red,表示变量 c当前代表红色。

通过这段代码,可以定义和使用一组有意义的颜色值,便于代码的可读性和维护性。

2.常量表达式用于显式设置枚举常量的值。

enum ColorSet { White = 0xFF, Grey = 0x7F, Black = 0x00 }
let c: ColorSet = ColorSet.Black;

 这段代码定义了一个名为ColorSet的枚举类型,用于表示颜色集。枚举中的每个成员(White、Grey、Black)都对应一个十六进制数值。变量c被赋值为ColorSet.Black,即黑色。

  1. 定义枚举ColorSet:定义了一个枚举类型ColorSet,其中包含三个成员:WhiteGreyBlack,并分别赋予它们对应的十六进制数值。
  2. 变量赋值:声明一个变量c,并将其赋值为ColorSet枚举中的Black成员,即黑色。

Union类型

Union类型,即联合类型,是由多个类型组合成的引用类型。联合类型包含了变量可能的所有类型。

什么是联合类型?

联合类型(Union Types)是 TypeScript 中一个强大的特性,它允许一个变量可以是多种类型中的任意一种。使用 `|` 符号来分隔不同的类型。

联合类型是 TypeScript 中处理多种可能类型的强大工具。通过合理使用联合类型和类型守卫,我们可以编写既灵活又类型安全的代码。在实际开发中,联合类型特别适用于处理 API 响应、用户输入、状态管理等场景。因为ArkTS继承自TS,自然一致。

// 定义几个不同的类
class Cat {
    name: string = 'cat';
    sound: string = 'meow';
    
    makeSound(): string {
        return `${this.name} says ${this.sound}`;
    }
}

class Dog {
    name: string = 'dog';
    sound: string = 'woof';
    
    makeSound(): string {
        return `${this.name} says ${this.sound}`;
    }
}

class Bird {
    name: string = 'bird';
    sound: string = 'chirp';
    canFly: boolean = true;
    
    makeSound(): string {
        return `${this.name} says ${this.sound}`;
    }
}

// 定义联合类型
// Animal 可以是 Cat、Dog、Bird 类的实例,也可以是基本类型
type Animal = Cat | Dog | Bird | number | string | boolean | null | undefined;

// 使用联合类型
let animal: Animal;

// 1. 赋值为类实例
animal = new Cat();
console.log('当前动物:', animal);
if (animal instanceof Cat) {
    console.log('这是一只猫:', animal.makeSound());
}

animal = new Dog();
console.log('当前动物:', animal);
if (animal instanceof Dog) {
    console.log('这是一只狗:', animal.makeSound());
}

animal = new Bird();
console.log('当前动物:', animal);
if (animal instanceof Bird) {
    console.log('这是一只鸟:', animal.makeSound());
    console.log('能飞吗?', animal.canFly);
}

// 2. 赋值为基本类型
animal = 42;
console.log('数字类型:', animal);

animal = 'elephant';
console.log('字符串类型:', animal);

animal = true;
console.log('布尔类型:', animal);

animal = null;
console.log('null 类型:', animal);

animal = undefined;
console.log('undefined 类型:', animal);

// 类型守卫函数示例
function processAnimal(animal: Animal): string {
    // 使用 instanceof 进行类型检查
    if (animal instanceof Cat) {
        return `处理猫: ${animal.makeSound()}`;
    } else if (animal instanceof Dog) {
        return `处理狗: ${animal.makeSound()}`;
    } else if (animal instanceof Bird) {
        return `处理鸟: ${animal.makeSound()}, 能飞: ${animal.canFly}`;
    } else if (typeof animal === 'number') {
        return `处理数字: ${animal}`;
    } else if (typeof animal === 'string') {
        return `处理字符串: ${animal}`;
    } else if (typeof animal === 'boolean') {
        return `处理布尔值: ${animal}`;
    } else if (animal === null) {
        return '处理 null 值';
    } else if (animal === undefined) {
        return '处理 undefined 值';
    }
    return '未知类型';
}

// 测试类型守卫
console.log('\n=== 类型守卫测试 ===');
console.log(processAnimal(new Cat()));
console.log(processAnimal(new Dog()));
console.log(processAnimal(new Bird()));
console.log(processAnimal(100));
console.log(processAnimal('tiger'));
console.log(processAnimal(false));
console.log(processAnimal(null));
console.log(processAnimal(undefined));

Aliases类型

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

type Matrix = number[][];
type Handler = (s: string, no: number) => string;
type Predicate <T> = (x: T) => boolean;
type NullableObject = Object | null;

这段代码定义了几个类型别名,用于描述不同类型的数据结构和函数签名。Matrix表示一个二维数字数组,Handler描述了一个接受字符串和数字作为参数并返回字符串的函数,Predicate是一个泛型类型,表示一个接受任意类型参数并返回布尔值的函数,NullableObject描述了可以是对象或 null 的类型。

  1. 定义了一个 Matrix类型别名,它是一个二维数字数组,这可能用于表示矩阵或表格数据结构。
  2. 定义了一个 Handler类型别名,它是一个函数类型,接受一个字符串和一个数字作为参数,返回一个字符串。这可能用于处理字符串和数字数据并生成新的字符串。
  3. 定义了一个 Predicate类型别名,但它是一个泛型类型,表示它可以应用于任何类型的参数。这个函数类型通常用于条件判断,返回一个布尔值。
  4. 定义了一个 NullableObject类型别名,表示一个可以是对象或 null 的类型,这在处理可能缺失的数据时非常有用。

写到这里,ArkTS——声明篇就讲完了,欢迎你的点赞、关注、收藏。你的关注是我最大的动力

Logo

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

更多推荐