ArkTS 基础速通

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类型系统

基础类型对照。

概念ArkTSKotlinJava
整数numberInt / Longint / long
浮点numberDouble / Floatdouble / float
字符串stringStringString
布尔booleanBooleanboolean
数组number[]IntArray / List<T>int[] / List<T>
顶层类型object(禁用 any)AnyObject
可空string | nullString?@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;    // 推断 boolean
Kotlin
val x = 5        // 推断 Int
val s = "hi"      // 推断 String
val ok = true      // 推断 Boolean
Java
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 的 List 扩展函数命名一致(map/filter/forEach/reduce)。ArkTS 没有内建的不可变集合类,靠 const + 不重新赋值来约束。
数组方法扩展教程 → 30 个数组方法按使用频率逐讲解(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.RED
Java
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: stringvar msg by remember { mutableStateOf() }
父 → 子(单向)@Param msg: string普通参数传入
子 → 父(事件)@Event onChange: (v: string) => voidlambda 回调上提
父子双向绑定@Link msg: stringmutableStateOf 上提 + 回调
观察类对象@ObservedV2 + @Trace + @ObjectLinkremember + derivedStateOf / ViewModel
跨多层传递@Provider / @ConsumerCompositionLocal
应用级全局状态AppStorage / LocalStorageViewModel + 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官方文档与延伸阅读

建议把这些加入收藏,边写边查。

上手路径建议:① 装 DevEco Studio → ② 建一个 Empty Ability 模板 → ③ 照着本文把变量/类/函数改成 ArkTS 写法跑通 → ④ 再学 ArkUI 组件与状态管理。你已有的 Kotlin/Compose 经验能直接平移。

面向 Android 开发者 · ArkTS 基础语法对照速通 · WorkBuddy 整理