ArkTS 基础语法学习笔记

        本文是我学习鸿蒙 ArkTS 基础篇的总结笔记,涵盖基础入门、变量和类型、数组、对象、函数、箭头函数六个部分,方便自己回顾,也希望对同样在学 ArkTS 的朋友有帮助。

一、ArkTS 基础入门

        ArkTS 是华为鸿蒙(HarmonyOS)为 ArkUI 声明式开发范式量身打造的编程语言,它在 TypeScript(TS)的基础上做了扩展和约束,同时保留了 TS 的大部分语法特性。可以简单理解为:

JavaScript → TypeScript → ArkTS

        也就是说,只要有 JS/TS 基础,上手 ArkTS 会非常快。ArkTS 相比 TS 主要做了以下几点强化:

  • 强制静态类型检查:不允许 anyunknown 这类模糊类型随意使用,变量类型在编译期就要明确,减少运行时错误。
  • 不支持部分动态特性:比如不支持 Object.definePropertywith 语句等动态修改对象结构的写法,保证代码可预测、可优化。
  • 面向对象 + 声明式 UI:ArkTS 既支持传统的类、接口写法,也提供了 @Component@State 等装饰器(Decorator)用于声明式构建 UI。

        一个最简单的 ArkTS 文件后缀是 .ets(Extended TypeScript),基础的 Hello World 大致长这样:

function sayHello(name: string): string {
  return `Hello, ${name}!`;
}

console.info(sayHello('ArkTS'));

        学习入门阶段,重点是搭好 DevEco Studio 开发环境,跑通一个空的 Ability 工程,理解好 .ets 文件的基本结构,为后面学变量、函数打基础。

二、变量和类型

2.1 变量声明

        ArkTS 沿用 TS 的三种声明方式,但更推荐使用 letconst,不建议使用 var

let age: number = 18;       // 可变
const name: string = 'Tom'; // 不可变,声明后不能重新赋值
  • let:块级作用域,值可以修改,日常变量首选。
  • const:块级作用域,值不可重新赋值,适合常量、不会变的配置项。
  • var:ArkTS 中不推荐甚至部分场景会报错,因为它是函数作用域,容易引发变量提升等问题。

2.2 基本数据类型

        ArkTS 是强类型语言,声明变量时最好显式标注类型:

let isDone: boolean = false;
let count: number = 100;
let message: string = 'ArkTS';
let notDefined: undefined = undefined;
let empty: null = null;

        常见基础类型一览:

类型 说明 示例
number 数字,不区分整数浮点数 let n: number = 3.14
string 字符串,支持模板字符串 let s: string = `hi ${n}`
boolean 布尔值 let b: boolean = true
void 一般用于函数无返回值 function log(): void {}
null / undefined 空值 -

2.3 类型推断与类型注解

        ArkTS 支持类型推断,但强烈建议关键变量都写上类型注解,这也是它和普通 JS 最大的区别之一:

let score = 90;         // 推断为 number
let score2: number = 90; // 显式注解,更推荐

        需要特别注意:ArkTS 不允许变量类型在运行时发生改变(不像 JS 那样随便变来变去),也不建议使用 any,这是刚开始学的时候最容易踩的坑。

三、数组

        数组是 ArkTS 中最常用的数据结构之一,声明方式主要有两种:

// 方式一:类型 + 方括号(推荐)
let list1: number[] = [1, 2, 3];

// 方式二:泛型写法
let list2: Array<string> = ['a', 'b', 'c'];

3.1 常用操作

let fruits: string[] = ['apple', 'banana'];

fruits.push('orange');       // 添加元素
fruits.pop();                 // 删除最后一个
console.info(fruits[0]);      // 访问元素
console.info(fruits.length);  // 获取长度

// 遍历
for (let fruit of fruits) {
  console.info(fruit);
}

// forEach / map / filter 同样支持
let upper = fruits.map((item: string): string => item.toUpperCase());

3.2 注意点

  • 数组一旦声明了元素类型,就不能混入其他类型的元素,比如 number[] 里不能塞字符串,这一点和普通 JS 数组差别很大。
  • 多维数组写法:let matrix: number[][] = [[1, 2], [3, 4]];

四、对象

        ArkTS 中定义对象结构,推荐使用 interface(接口)或 class(类),而不是像 JS 那样随意用字面量拼一个对象(ArkTS 对对象的动态扩展做了限制)。

4.1 使用 interface 定义对象结构

interface Person {
  name: string;
  age: number;
  email?: string; // 可选属性
}

let p: Person = {
  name: 'Tom',
  age: 20
};

console.info(p.name);

4.2 使用 class 定义对象

class Animal {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  speak(): string {
    return `${this.name} says hello`;
  }
}

let dog = new Animal('旺财', 2);
console.info(dog.speak());

4.3 注意点

  • ArkTS 中的对象结构在编译期就要确定,不支持给对象随意新增未声明的属性,这和 JS 中"对象是个筐,啥都能装"的用法不同,一开始很容易报错。
  • 推荐尽量用 interface 描述数据结构(比如接口返回的数据),用 class 封装带方法和状态的业务对象。

五、函数

5.1 普通函数声明

function add(a: number, b: number): number {
  return a + b;
}
  • 参数和返回值都建议显式标注类型。
  • 如果函数没有返回值,返回类型写 void

5.2 可选参数与默认参数

function greet(name: string, greeting?: string): string {
  return `${greeting ?? 'Hello'}, ${name}`;
}

function greet2(name: string, greeting: string = 'Hi'): string {
  return `${greeting}, ${name}`;
}
  • ? 表示可选参数,必须放在必填参数后面。
  • 也可以直接给参数写默认值,效果类似。

5.3 函数类型

        函数本身也可以作为类型来声明变量:

let calc: (a: number, b: number) => number;
calc = (a, b) => a + b;

六、箭头函数

        箭头函数是 ES6 引入、在 ArkTS 中也大量使用的简洁写法,尤其是在 UI 事件回调、数组方法(map/filter)里非常常见。

6.1 基本写法

// 普通函数
function add(a: number, b: number): number {
  return a + b;
}

// 箭头函数写法
let add2 = (a: number, b: number): number => {
  return a + b;
};

// 只有一行返回值时可以省略花括号和 return
let add3 = (a: number, b: number): number => a + b;

6.2 箭头函数 vs 普通函数

对比点 普通函数 箭头函数
this 指向 调用时动态绑定 继承外层作用域的 this,不会改变
写法 相对繁琐 更简洁,适合回调场景
是否有 arguments 没有

        在 ArkUI 组件里写按钮点击等事件回调时,箭头函数用得非常多,因为它不会改变 this 指向,可以直接访问组件内部的状态:

Button('点击我')
  .onClick(() => {
    this.count++; // 箭头函数中 this 仍指向组件实例
  })

七、小结

        这一阶段学下来,ArkTS 给我最大的感受是:"更严格的 TypeScript"。它牺牲了一部分 JS/TS 的灵活性(比如禁用 any、限制对象动态扩展),换来的是编译期就能发现的类型安全和更好的运行时性能,这也很符合它作为移动端/元服务开发语言的定位。

后续学习路线上,打算继续深入 ArkUI 的声明式开发(@Component@State@Prop 等装饰器),把这些基础语法真正用到界面开发中去,到时候再写一篇进阶笔记。


本文为个人学习笔记整理,如有理解偏差欢迎指正交流。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐