ArkTS 基础语法速通
面向 Android 开发者(Java / Kotlin)的对照讲解。一句核心:ArkTS 是「加强严格版 TypeScript」,写法最接近 Kotlin。
静态强类型
对照 Kotlin / Java
声明式 UI · ArkUI
HarmonyOS 官方语言
01ArkTS 是什么
先建立整体认知,再逐点对照 Java / Kotlin。
- ArkTS = TypeScript 的超集 + 严格约束。它来自 TS,但砍掉了大量「动态」特性(如
any、解构赋值、运行时增删对象属性),强制静态类型。 - 写法最接近 Kotlin:类型后置(
name: string)、let/const对应var/val、箭头函数、空安全用联合类型。 - 运行在 ArkUI 框架上:UI 用声明式(类似 Jetpack Compose),而非 Android 的 XML/View。
- 关键限制(从 TS/JS 迁移必看):禁用
var(用let/const)、禁用any/unknown、禁用解构赋值、禁止运行时给对象加字段、禁止for...in。
一句话类比:把 ArkTS 当成「像 Kotlin 一样严格、又长着 TS 脸」的语言,你 80% 的直觉都能直接复用。
02变量与常量
ArkTS 用 let(可变)和 const(不可变);Kotlin 用 var/val;Java 用 类型 名 + final。
ArkTS
let count: number = 0; // 可变
const name: string = 'Hi'; // 不可变(推荐)
let tag = 'new'; // 类型可省略Kotlin
var count: Int = 0 // 可变
val name: String = "Hi" // 不可变(推荐)
val tag = "new" // 类型可省略Java
int count = 0; // 可变
final String name = "Hi"; // 不可变
var tag = "new"; // Java 10+ 推断对照记忆:
const ≈ val,let ≈ var。ArkTS 里 没有 var 关键字(和 JS 早期不同),一律用 let。03类型系统
基础类型对照。
| 概念 | ArkTS | Kotlin | Java |
|---|---|---|---|
| 整数 | number | Int / Long | int / long |
| 浮点 | number | Double / Float | double / float |
| 字符串 | string | String | String |
| 布尔 | boolean | Boolean | boolean |
| 数组 | number[] | IntArray / List<T> | int[] / List<T> |
| 顶层类型 | object(禁用 any) | Any | Object |
| 可空 | string | null | String? | @Nullable / Optional |
| 联合类型 | 'a' | 'b' ✅ | sealed class | 枚举 / 多态 |
重点:ArkTS 里 没有
any,所有类型必须明确。整数浮点统一为 number(类似 JS),但类型严格检查。04类型推断
三种语言都支持「声明时推断」,ArkTS 与 Kotlin 几乎一致。
ArkTS
let x = 5; // 推断 number
const s = 'hi'; // 推断 string
let ok = true; // 推断 booleanKotlin
val x = 5 // 推断 Int
val s = "hi" // 推断 String
val ok = true // 推断 BooleanJava
var x = 5; // 推断 int
var s = "hi"; // 推断 String
var ok = true; // 推断 boolean提示:函数参数和返回类型在 ArkTS 中建议显式标注(编译器推荐,且大型项目更清晰),而 Kotlin 返回类型常可省略(单行表达式函数)。
05函数
参数类型后置、默认参数、箭头函数——都和 Kotlin 很像。
ArkTS
// 普通函数
function add(a: number, b: number): number {
return a + b;
}
// 箭头函数(推荐)
const add = (a: number, b: number): number => a + b;
// 默认参数
function greet(name: string = 'Guest'): string {
return `Hi ${name}`;
}Kotlin
// 表达式函数
fun add(a: Int, b: Int): Int = a + b
// 普通函数体
fun add(a: Int, b: Int): Int {
return a + b
}
// 默认参数
fun greet(name: String = "Guest"): String = "Hi $name"Java
int add(int a, int b) { return a + b; }
// Java 没有默认参数,需方法重载
String greet(String name) { return "Hi " + name; }
String greet() { return greet("Guest"); }对照:ArkTS 箭头函数
=> 与 Kotlin 的 = 表达式函数等价;Java 没有默认参数,只能靠重载。ArkTS 也没有命名参数(Kotlin 有),想模拟就传对象。06类与对象
class、constructor、字段、访问修饰符,三者都有;Kotlin 的「主构造 + 属性」最简洁。
ArkTS
class User {
name: string;
private age: number = 0;
constructor(name: string) {
this.name = name;
}
sayHi(): string {
return `Hi, I am ${this.name}`;
}
}Kotlin
class User(val name: String) {
private var age: Int = 0
fun sayHi(): String = "Hi, I am $name"
}Java
public class User {
public final String name;
private int age = 0;
public User(String name) {
this.name = name;
}
public String sayHi() {
return "Hi, I am " + name;
}
}对照:ArkTS 的
constructor 相当于 Java 的构造方法、Kotlin 的主构造。字段需逐个声明并初始化(ArkTS 不允许声明时不赋值又不用 ! 断言)。07继承与接口
extends / implements 与 Java 同词;Kotlin 用 :。
ArkTS
interface Shape {
area(): number;
}
class Circle implements Shape {
private r: number;
constructor(r: number) { this.r = r; }
area(): number {
return Math.PI * this.r * this.r;
}
}Kotlin
interface Shape {
fun area(): Double
}
class Circle(private val r: Double) : Shape {
override fun area(): Double = Math.PI * r * r
}Java
interface Shape {
double area();
}
class Circle implements Shape {
private final double r;
Circle(double r) { this.r = r; }
public double area() {
return Math.PI * r * r;
}
}对照:ArkTS 继承用
extends(类)、implements(接口),语法与 Java 完全一致;Kotlin 统一用 : 并加 override。08可空类型与空安全
ArkTS 用联合类型 | null + 显式判空;Kotlin 用 ?;Java 用注解 / Optional。
ArkTS
let name: string | null = null;
// 严格空安全:必须判空
if (name !== null) {
console.log(name.length);
}
// 可选链(类似 Kotlin ?.)
const len = name?.length;Kotlin
var name: String? = null
// 安全调用
val len = name?.length
// 配合 let 处理非空
name?.let { println(it.length) }
// 非空断言(谨慎)
val s = name!!Java
String name = null;
// 手动判空(无编译期强制)
if (name != null) {
System.out.println(name.length());
}
// 或 Optional(更啰嗦)
Optional<String> n = Optional.empty();对照:ArkTS 的
?. 可选链与 Kotlin 的 ?. 完全一致;但 ArkTS 没有 !! 断言运算符,需用 if (x !== null) 或 ! 非空断言(x!.length,谨慎用)。09集合与数组
ArkTS 数组用 T[],高阶函数 map/filter/forEach 与 Kotlin 几乎一样。
ArkTS
let nums: number[] = [1, 2, 3];
nums.forEach(n => console.log(n));
const doubled = nums.map(n => n * 2);
const even = nums.filter(n => n % 2 === 0);
// 不可变用 const + 不复写
const total = nums.reduce((a, b) => a + b, 0);Kotlin
val nums = listOf(1, 2, 3)
nums.forEach { println(it) }
val doubled = nums.map { it * 2 }
val even = nums.filter { it % 2 == 0 }
val total = nums.sum()
// 或 nums.fold(0) { a, b -> a + b }Java
List<Integer> nums = List.of(1, 2, 3);
nums.forEach(n -> System.out.println(n));
List<Integer> doubled = nums.stream()
.map(n -> n * 2)
.toList();
// 可变集合用 ArrayList对照:ArkTS 的数组高阶函数和 Kotlin 的
数组方法扩展教程 → 30 个数组方法按使用频率逐讲解(List 扩展函数命名一致(map/filter/forEach/reduce)。ArkTS 没有内建的不可变集合类,靠 const + 不重新赋值来约束。forEach / map / filter / push / splice / reduce / sort …),每个配 ArkTS + Kotlin/Java 对照与常见坑(原地修改、越界返回 undefined、sort 数字需回调等)。
10控制流
if/else、switch、循环对照。
ArkTS
// if / else
if (score >= 60) { /* pass */ }
else { /* fail */ }
// switch(需 break,无隐式贯穿)
switch (type) {
case 'a': doA(); break;
case 'b': doB(); break;
default: doDefault();
}
// 循环
for (let i = 0; i < nums.length; i++) { }
for (const n of nums) { } // 遍历元素Kotlin
// if 是表达式,可直接赋值
val r = if (score >= 60) "pass" else "fail"
// when(更强,无需 break)
when (type) {
"a" -> doA()
"b" -> doB()
else -> doDefault()
}
// 循环
for (n in nums) { } // 遍历元素
nums.forEach { }Java
if (score >= 60) { } else { }
// Java 14+ 可用箭头 switch(无需 break)
switch (type) {
case "a" -> doA();
case "b" -> doB();
default -> doDefault();
}
for (int n : nums) { } // 增强 for
for (int i = 0; i < nums.size(); i++) { }对照:ArkTS 的
switch 像 Java 传统写法(要 break);Kotlin 的 when 更现代。ArkTS 的 for...of 遍历元素,相当于 Java 的增强 for / Kotlin 的 for...in(注意 ArkTS 禁止 for...in 遍历对象键)。11对象字面量 / data class / record
ArkTS 用对象字面量(需对应 interface);Kotlin 用 data class;Java 16+ 用 record。
ArkTS
interface Point {
x: number;
y: number;
}
const p: Point = { x: 1, y: 2 };
// ⚠️ ArkTS 禁止解构赋值
const x = p.x;
const y = p.y;Kotlin
data class Point(val x: Int, val y: Int)
val p = Point(1, 2)
// Kotlin 支持解构
val (x, y) = p
println(p.x)Java
record Point(int x, int y) {}
Point p = new Point(1, 2);
System.out.println(p.x());ArkTS 特有坑:① 对象字面量必须对应一个已声明的
interface/class,不能「无类型直接写 {...}」;② 禁止解构赋值 const {x,y}=p 会编译报错,必须逐个取值。12泛型
三者语法几乎一致,都用 <T>。
ArkTS
class Box<T> {
private value: T;
constructor(v: T) { this.value = v; }
get(): T { return this.value; }
}
const b = new Box<string>('hi');Kotlin
class Box<T>(private val value: T) {
fun get(): T = value
}
val b = Box("hi") // 自动推断Java
class Box<T> {
private final T value;
Box(T value) { this.value = value; }
T get() { return value; }
}
Box<String> b = new Box<>("hi");对照:ArkTS 泛型与 Java/Kotlin 一致。注意编译器建议泛型调用显式标注类型(如
http.get<User>()),否则可能报隐式类型错误。13枚举
三者都支持枚举,写法接近。
ArkTS
enum Color {
Red, Green, Blue
}
const c: Color = Color.Red;Kotlin
enum class Color {
RED, GREEN, BLUE
}
val c = Color.REDJava
enum Color {
RED, GREEN, BLUE
}
Color c = Color.RED;对照:ArkTS 枚举成员名默认首字母大写约定(同 Java)。ArkTS 枚举还能带值和方法的写法更接近 TS,可承载简单关联数据。
14声明式 UI:ArkUI vs Jetpack Compose
如果你写过 Compose,ArkUI 几乎零门槛;都是「函数/结构体描述界面 + 状态驱动刷新」。
ArkTS · ArkUI
@Entry
@Component
struct HelloPage {
@State message: string = 'Hello';
build() {
Column() {
Text(this.message)
.fontSize(24)
Button('点击')
.onClick(() => {
this.message = 'Clicked';
})
}
}
}Kotlin · Compose
@Composable
fun HelloPage() {
var message by remember {
mutableStateOf("Hello")
}
Column {
Text(message, fontSize = 24.sp)
Button(onClick = {
message = "Clicked"
}) {
Text("点击")
}
}
}对照:① ArkUI 用
@Component struct(结构体)声明组件,Compose 用 @Composable fun;② 状态都用「装饰器/remember」标记,状态变 → 界面自动重绘;③ 链式属性 .fontSize() 对应 Compose 的具名参数 fontSize =。纯 Java/XML 开发者需切换思维到「声明式」。15状态管理 V2 对照
HarmonyOS API 12+ 推荐用 ArkUI V2 装饰器,语义比 V1 更清晰。
| 场景 | ArkTS(ArkUI V2) | Kotlin(Compose) |
|---|---|---|
| 组件内部可变状态 | @Local msg: string | var msg by remember { mutableStateOf() } |
| 父 → 子(单向) | @Param msg: string | 普通参数传入 |
| 子 → 父(事件) | @Event onChange: (v: string) => void | lambda 回调上提 |
| 父子双向绑定 | @Link msg: string | mutableStateOf 上提 + 回调 |
| 观察类对象 | @ObservedV2 + @Trace + @ObjectLink | remember + derivedStateOf / ViewModel |
| 跨多层传递 | @Provider / @Consumer | CompositionLocal |
| 应用级全局状态 | AppStorage / LocalStorage | ViewModel + StateFlow |
| 组件声明 | @ComponentV2 struct Xxx { ... } | @Composable fun Xxx() { ... } |
V2 关键变化:①
@Local 替代 @State,@Param 替代 @Prop;② 子组件想修改父组件数据,V2 推荐 @Event 回调(而非 @Link 双向绑定),与 Compose 的「状态提升 + 回调」完全一致;③ @ObservedV2 + @Trace 解决类对象属性级观测,V1 的 @Observed/@ObjectLink 在复杂场景下容易漏刷新;④ V2 组件必须用 @ComponentV2 声明,不能和 V1 装饰器混用。16官方文档与延伸阅读
建议把这些加入收藏,边写边查。
- ArkTS 语言官方主页(华为开发者联盟)
- ArkTS 开发入门(视频课程 + 语法文档 + 资源)
- ArkUI 声明式开发框架(官方主页)
- DevEco Studio 下载与安装
- HarmonyOS 文档中心(搜全部指南 / API 参考,含装饰器语法)
上手路径建议:① 装 DevEco Studio → ② 建一个 Empty Ability 模板 → ③ 照着本文把变量/类/函数改成 ArkTS 写法跑通 → ④ 再学 ArkUI 组件与状态管理。你已有的 Kotlin/Compose 经验能直接平移。