ArkTS(Ark TypeScript)是华为专为 HarmonyOS 应用开发设计的编程语言。它在 TypeScript 的基础上进行了扩展和优化,优先考虑开发效率和运行时性能,同时保持与 JavaScript/TypeScript 生态的兼容性。
几个关键事实:
| 属性 | 说明 |
|---|---|
| 首次发布 | 2021 年 9 月 30 日(OpenHarmony 上) |
| 当前稳定版 | 6.0.1.112(2025 年 11 月 20 日) |
| 范式 | 多范式:函数式、泛型、声明式、面向对象 |
| 类型系统 | 静态、结构化、渐进 |
| 编译方式 | AOT 编译为机器码(通过 Ark Compiler) |
| 文件扩展名 | .ets、.ts |
| 开发工具 | DevEco Studio |
| 许可证 | Apache(OpenHarmony 部分) |
ArkTS 的前身是 eTS(extended TypeScript),在 2022 年 HDC 大会上正式更名为 ArkTS,随 HarmonyOS 3.1 发布。
这是最核心的问题。TypeScript 是为 Web 设计的,它最终编译为 JavaScript 在浏览器或 Node.js 中运行。而 HarmonyOS 需要的是:
TypeScript 的灵活性(any 类型、动态对象修改、结构化类型)在 Web 开发中是优势,但在系统级应用开发中是性能瓶颈。ArkTS 通过约束这些特性来换取运行时性能。
这是 ArkTS 最需要理解的部分。它不是简单的"TypeScript + 新 API",而是"TypeScript - 动态特性 + 系统扩展"。
TypeScript 中类型注解是可选的,ArkTS 中是强制的。any 类型被禁止。
// TypeScript — 可以工作
let name = "Huawei" // 推断为 string
let data: any = fetchData() // any 允许
// ArkTS — 必须显式声明类型
let name: string = "Huawei" // 必须标注类型
let data: CallResult = fetchData() // 禁止使用 any不能在运行时给对象添加/删除属性,不能改变属性类型。
class Point {
public x: number = 0
public y: number = 0
}
let p = new Point()
// 以下操作在 ArkTS 中全部编译报错:
delete p.x // ❌ 不能删除属性
(p as any).z = 'label' // ❌ 不能添加新属性
(p as any).x = 'Hello!' // ❌ 不能改变属性类型TypeScript 中两个类只要属性结构相同就可以互相赋值(duck typing),ArkTS 不支持。
class Dog {
name: string = ''
}
class Cat {
name: string = ''
}
// TypeScript — 合法(结构相同)
let animal: Dog = new Cat()
// ArkTS — 编译错误(名义类型,不同类不能互换)// TypeScript
let n = +'42' // 合法,字符串转数字
// ArkTS
let n = +'42' // ❌ 编译错误:一元 + 只能用于数字类型T extends U ? X : Y)var 关键字(必须用 let / const)eval() 和动态代码执行arguments 对象[key: string]: any)这些限制的共同目标:让编译器在编译期就能完全确定程序的类型信息和内存布局,从而生成高效的机器码。
ArkTS 不只是一个语言,它与 ArkUI 声明式 UI 框架深度绑定。如果你用过 SwiftUI 或 Jetpack Compose,会感到非常熟悉。
@Entry
@Component
struct Index {
@State message: string = 'Hello World'
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
Button('点击我')
.type(ButtonType.Capsule)
.backgroundColor('#0D9FFB')
.onClick(() => {
this.message = '你好,鸿蒙!'
})
}
.width('100%')
}
.height('100%')
}
}几个关键概念:
@Entry:标记应用入口组件@Component:标记自定义组件@State:响应式状态,变化时自动触发 UI 更新build():声明式描述 UI 结构.fontSize(), .onClick()):设置属性和事件ArkTS 提供多种装饰器来管理状态流转:
// 父组件
@Component
struct Parent {
@State parentMsg: string = '来自父组件的数据'
build() {
Column() {
Child({ msg: this.parentMsg })
Button('更新子组件')
.onClick(() => {
this.parentMsg = '数据已更新'
})
}
}
}
// 子组件
@Component
struct Child {
@Prop msg: string // 单向数据流:父 → 子
build() {
Text(this.msg).fontSize(18)
}
}| 装饰器 | 作用 | 数据流 |
|---|---|---|
@State | 组件内部状态 | 组件内 |
@Prop | 父组件传入的只读属性 | 父 → 子(单向) |
@Link | 父子组件双向绑定 | 父 ↔ 子(双向) |
@Provide / @Consume | 跨层级共享状态 | 祖先 → 后代 |
@StorageLink | 应用级全局状态 | 全局共享 |
@Component
struct UserList {
@State users: string[] = ['Alice', 'Bob', 'Charlie']
@State showList: boolean = true
build() {
Column() {
Button('切换显示')
.onClick(() => { this.showList = !this.showList })
// 条件渲染
if (this.showList) {
// 循环渲染
ForEach(this.users, (user: string) => {
Text(user).fontSize(18).margin(5)
}, (item: string) => item)
}
}
}
}ArkTS 的执行路径与 TypeScript 完全不同:
ArkTS 源码 (.ets)
↓
ets_frontend(前端编译器)
↓
ARK Bytecode (.abc)
↓
Ark Compiler(AOT 编译)
↓
机器码(原生执行)关键技术栈:
这套架构的结果:ArkTS 应用的启动速度和运行性能远优于基于 JS 引擎的方案。
| 维度 | ArkTS (HarmonyOS) | Swift (iOS) | Kotlin (Android) | Dart (Flutter) |
|---|---|---|---|---|
| 类型系统 | 静态强类型 | 静态强类型 | 静态强类型 | 静态强类型 |
| UI 范式 | ArkUI 声明式 | SwiftUI 声明式 | Compose 声明式 | Widget 声明式 |
| 编译方式 | AOT | AOT | AOT / JIT | AOT / JIT |
| 跨平台 | ArkUI-X(Android/iOS) | 仅 Apple | KMP(跨平台) | 原生跨平台 |
| 生态成熟度 | 快速增长中 | 成熟 | 成熟 | 成熟 |
| 学习曲线 | TS 开发者友好 | 需学 Swift | 需学 Kotlin | 需学 Dart |
ArkTS 最大的差异化优势:如果你已经会 TypeScript,学习成本最低。而 Swift、Kotlin、Dart 都需要从头学习一门新语言。
从 2024 年 HarmonyOS NEXT 发布起,整个生态支持三种语言:
| 语言 | 定位 | 适用场景 |
|---|---|---|
| ArkTS | 主力应用开发语言 | 绝大多数应用、UI 开发 |
| 仓颉(Cangjie) | 高性能静态语言 | 对性能和安全性要求极高的场景 |
| C/C++ | 底层扩展 | 硬件加速、高性能计算、Native 模块 |
三者可以互操作:C/C++ 模块可以被封装为 ArkTS 或仓颉的扩展模块。
ArkTS 本质上是一场 "以约束换性能" 的语言实验。它保留了 TypeScript 的语法亲和力,砍掉了动态特性,加上了 AOT 编译和声明式 UI,最终形成了一套专为移动/IoT 场景优化的开发范式。
它不会替代 TypeScript 在 Web 领域的地位,但在鸿蒙生态中,它是唯一的主力选择。
对于 TypeScript 开发者,这可能是最容易跨界移动端的一次机会。对于所有面向中国市场的团队,这已经不是"要不要学"的问题,而是"什么时候开始"的问题。