一、ArkTS语言概述

1.1 什么是ArkTS?

ArkTS是鸿蒙生态的应用开发语言,它在保持TypeScript基本语法风格的基础上,通过规范强化静态检查和分析,使得在程序运行前能检测更多错误,同时提升运行时性能。

ArkTS针对移动设备特性进行了专门优化,解决了传统编程语言在移动设备上运行缓慢、低效、功耗大的问题,专注于提高运行效率。

1.2 设计理念与优势

ArkTS的设计理念主要体现在以下几个方面:

  • 静态类型检查:在编译时检测类型错误,降低运行时错误风险

  • 性能优化:减少运行时类型检查,降低运行时负载,提升执行性能

  • 开发生态兼容:支持与标准JS/TS高效互操作,兼容JS/TS生态

  • 渐进式学习:保留TypeScript大部分语法特性,方便开发者快速上手

1.3 ArkTS与TypeScript的区别

虽然ArkTS基于TypeScript,但也有一些重要区别:

特性 TypeScript ArkTS
对象布局 运行时可以更改 不支持运行时更改
类型系统 Structural Typing Nominal Typing
对象字面量 可不标注类型 必须标注类型
动态类型 支持 受限,减少运行时开销

二、ArkTS基础语法

2.1 变量与常量声明

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

// 变量声明 - 使用let关键字
let hi: string = 'hello';
hi = 'hello, world';

// 常量声明 - 使用const关键字
const hello: string = 'hello';

// 自动类型推断
let hi1: string = 'hello';  // 显式指定类型
let hi2 = 'hello, world';   // 自动推断为string类型

2.2 基本数据类型

number类型

表示整数和浮点数:

let n1 = 3.14;              // 浮点数
let n2 = 0b1010;           // 二进制整数
let n3 = 0o755;            // 八进制整数  
let n4 = 1e2;              // 科学计数法

// 大整数使用bigInt类型
let bigInteger: BigInt = BigInt('999999999999999999999999999');
boolean类型
let isDone: boolean = false;

if (isDone) {
  console.log('Done!');
}
string类型
let s1 = 'Hello, world!\n';        // 普通字符串
let s2 = "this is a string";       // 双引号字符串
let a = 'Success';
let s3 = `The result is ${a}`;     // 模板字符串

2.3 复杂数据类型

array类型
let names: string[] = ['Alice', 'Bob', 'Carol'];
let numbers: Array<number> = [1, 2, 3, 4, 5];
enum类型
enum ColorSet { Red, Green, Blue }
let c: ColorSet = ColorSet.Red;

// 显式设置枚举值
enum ColorSet { White = 0xFF, Grey = 0x7F, Black = 0x00 }
Union类型
class Cat { name: string = 'cat'; }
class Dog { name: string = 'dog'; }

type Animal = Cat | Dog | number;

let animal: Animal = new Cat();
animal = 42;  // 合法赋值

2.4 类型别名

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

三、声明式UI开发

3.1 创建组件

ArkTS以声明方式组合和扩展组件来描述应用程序的UI。

无参数组件
Column() {
  Text('item 1')
  Divider()      // 无参数组件
  Text('item 2')
}
有参数组件
// string类型参数
Text('test')

// $r形式引入应用资源
Text($r('app.string.title_value'))

// 变量或表达式作为参数
Image(this.imagePath)
Text(`count: ${this.count}`)

3.2 配置属性

属性方法以"."链式调用的方式配置系统组件的样式和其他属性。

Text('hello')
  .fontSize(20)
  .fontColor(Color.Red)
  .fontWeight(FontWeight.Bold)

Image('test.jpg')
  .alt('error.jpg')    
  .width(100)    
  .height(100)

3.3 配置事件

事件方法以"."链式调用的方式配置系统组件支持的事件。

// 使用箭头函数
Button('Click me')
  .onClick(() => {
    this.myText = 'ArkUI';
  })

// 使用成员函数(需要bind this)
Button('add counter')
  .onClick(this.myClickHandler.bind(this))

3.4 组件结构

容器组件支持子组件配置,可以实现多级嵌套。

Column() {
  Row() {
    Image('test1.jpg')
      .width(100)
      .height(100)
    Button('click +1')
      .onClick(() => {
        console.info('+1 clicked!');
      })
  }
}

四、状态管理与渲染控制

4.1 状态管理

使用@State装饰器管理组件内部状态:

@Entry
@Component
struct MyComponent {
  @State count: number = 0;
  @State isVisible: boolean = true;

  build() {
    Column() {
      if (this.isVisible) {
        Text(`Count: ${this.count}`)
      }
      
      Button('Increase')
        .onClick(() => {
          this.count++;
        })
    }
  }
}

4.2 条件渲染

根据应用的不同状态渲染不同的UI界面。

@Entry
@Component
struct ConditionPage {
  @State isSuc: boolean = true;

  build() {
    Column({ space: 20 }) {
      if (this.isSuc) {
        Text('表白成功,O(∩_∩)O')
      } else {
        Text('继续加油,😔')
      }

      Button('切换状态')
        .onClick(() => {
          this.isSuc = !this.isSuc
        })
    }
  }
}

4.3 循环渲染

使用ForEach语句基于数组快速渲染组件列表。

@Entry
@Component
struct LoopPage {
  @State likes: string[] = ["唱歌", "跳舞", "学习", "打豆豆"];
  @State choose: string = "";

  build() {
    Column() {
      Text('你喜欢的是:' + this.choose)
      
      ForEach(this.likes, (item) => {
        Button(item)
          .width(200)
          .margin(10)
          .onClick(() => {
            this.choose = item
          })
      }, (item) => item)  // key生成函数
    }
  }
}
ForEach参数详解:
  • arr: 需要进行循环渲染的数据源,必须为数组

  • itemGenerator: 组件生成函数,为每个数组元素创建对应组件

  • keyGenerator (可选): key生成函数,用于唯一标识数据项

五、ArkTS与JavaScript混编

5.1 混编原理

ArkTS + JS混编让两种"运行时语言"通过共享上下文与对象映射实现协作:

  • 模块互调机制: ArkTS通过importglobalThis.requireNapi加载JS模块

  • NAPI桥接层: 在运行时把JS对象映射到ArkTS的类型体系中

  • 智能编译优化: Ark编译器自动生成桥接代码,避免性能损耗

5.2 实战示例

JS模块定义
// encrypt.js
export function encryptData(data) {
  const encoded = btoa(JSON.stringify(data));
  return encoded.split('').reverse().join('');
}

export function decryptData(str) {
  const decoded = atob(str.split('').reverse().join(''));
  return JSON.parse(decoded);
}
ArkTS调用JS模块
// pages/EncryptPage.ets
import { encryptData, decryptData } from '../common/encrypt.js';

@Entry
@Component
struct EncryptPage {
  @State message: string = '';
  @State encrypted: string = '';

  build() {
    Column() {
      TextInput({ placeholder: '输入要加密的内容', text: this.message })
        .onChange(value => this.message = value)

      Button('加密')
        .onClick(() => {
          this.encrypted = encryptData(this.message);
        })

      Text('加密结果:' + this.encrypted)
    }
  }
}

5.3 混编最佳实践

  1. 性能监控: 使用HAP Profiler监控混编场景下的性能

  2. 类型安全: 谨慎使用类型转换,明确上下文逻辑

  3. 模块路径: 使用静态声明的相对路径

  4. 安全性: 避免随意执行远程脚本,注意安全校验

六、ArkTS进阶特性

6.1 并发编程

ArkTS对并发编程API和能力进行了增强:

  • Promise和async/await: 标准的异步并发能力

  • TaskPool: 提供多线程运行环境,降低资源消耗

  • Worker: 支持多线程并发,线程间通信

6.2 语言基础类库

ArkTS提供了丰富的语言基础类库:

  • 容器类库: 提供常见的容器类增删改查能力

  • 数据处理: XML、URL、URI构造和解析能力

  • 字符串处理: 字符串编解码、Base64编码解码

  • 有理数操作: 支持有理数的比较、分子分母获取

七、实战案例:待办事项应用

下面通过一个完整的待办事项应用展示ArkTS的核心功能:

@Entry
@Component
struct TodoApp {
  @State tasks: string[] = ['学习ArkTS', '写一个Demo', '发布应用'];
  @State newTask: string = '';

  build() {
    Column({ space: 20 }) {
      // 标题
      Text('待办事项')
        .fontSize(30)
        .fontWeight(FontWeight.Bold)
        .fontColor(Color.Blue)

      // 输入新任务
      TextInput({ placeholder: '输入新任务', text: this.newTask })
        .onChange((value) => {
          this.newTask = value;
        })
        .width('80%')

      // 添加按钮
      Button('添加任务')
        .onClick(() => {
          if (this.newTask) {
            this.tasks.push(this.newTask);
            this.newTask = '';
          }
        })
        .width('50%')

      // 任务列表
      ForEach(this.tasks, (task: string, index?: number) => {
        Row() {
          Text(task)
            .fontSize(18)
          
          Button('删除')
            .onClick(() => {
              this.tasks.splice(index!, 1);
            })
            .backgroundColor(Color.Red)
        }
        .width('80%')
        .justifyContent(FlexAlign.SpaceBetween)
      }, (task: string) => task)

      // 任务统计
      if (this.tasks.length > 0) {
        Text(`共有 ${this.tasks.length} 个待办事项`)
          .fontSize(16)
          .fontColor(Color.Gray)
      } else {
        Text('没有待办事项,享受轻松时光!')
          .fontSize(16)
          .fontColor(Color.Green)
      }
    }
    .width('100%')
    .height('100%')
    .padding(20)
  }
}@Entry
@Component
struct TodoApp {
  @State tasks: string[] = ['学习ArkTS', '写一个Demo', '发布应用'];
  @State newTask: string = '';

  build() {
    Column({ space: 20 }) {
      // 标题
      Text('待办事项')
        .fontSize(30)
        .fontWeight(FontWeight.Bold)
        .fontColor(Color.Blue)

      // 输入新任务
      TextInput({ placeholder: '输入新任务', text: this.newTask })
        .onChange((value) => {
          this.newTask = value;
        })
        .width('80%')

      // 添加按钮
      Button('添加任务')
        .onClick(() => {
          if (this.newTask) {
            this.tasks.push(this.newTask);
            this.newTask = '';
          }
        })
        .width('50%')

      // 任务列表
      ForEach(this.tasks, (task: string, index?: number) => {
        Row() {
          Text(task)
            .fontSize(18)
          
          Button('删除')
            .onClick(() => {
              this.tasks.splice(index!, 1);
            })
            .backgroundColor(Color.Red)
        }
        .width('80%')
        .justifyContent(FlexAlign.SpaceBetween)
      }, (task: string) => task)

      // 任务统计
      if (this.tasks.length > 0) {
        Text(`共有 ${this.tasks.length} 个待办事项`)
          .fontSize(16)
          .fontColor(Color.Gray)
      } else {
        Text('没有待办事项,享受轻松时光!')
          .fontSize(16)
          .fontColor(Color.Green)
      }
    }
    .width('100%')
    .height('100%')
    .padding(20)
  }
}

八、开发建议与最佳实践

  1. 类型安全优先: 充分利用ArkTS的静态类型检查,减少运行时错误

  2. 组件化思维: 将UI拆分为可复用的自定义组件

  3. 状态管理: 合理使用@State@Prop@Link等装饰器管理状态

  4. 性能优化: 在循环渲染中提供合适的key生成函数

  5. 生态利用: 通过混编机制充分利用JS/TS现有生态

总结

ArkTS作为鸿蒙生态的应用开发语言,通过强类型系统声明式UI范式高性能运行时,为开发者提供了优秀的开发体验。同时,其与JavaScript/TypeScript的互操作能力让开发者可以充分利用现有生态,实现渐进式迁移和代码复用。

掌握ArkTS不仅需要理解其语法特性,更需要熟悉声明式UI开发思想和状态管理机制。随着鸿蒙生态的不断发展,ArkTS将在移动应用开发中扮演越来越重要的角色。

Logo

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

更多推荐