3. ArkTS语言基础:从零开始写第一个鸿蒙应用

ArkTS,说白了就是华为为OpenHarmony量身打造的一门语言。它基于TypeScript,又加了不少自己的东西。我刚开始接触时也觉得有点陌生,但用了一周后就发现——嗯,真香。

这一章,我们就把ArkTS的核心概念过一遍。你不用一次性全记住,先有个印象,后面写代码时自然会熟悉起来。

3.1 ArkTS简介:它到底是什么?

ArkTS是OpenHarmony应用开发的官方语言。它继承了TypeScript的类型系统和JavaScript的动态特性,还加入了声明式UI和状态管理。

我个人习惯把它理解为:TypeScript的超集 + 鸿蒙的UI框架。你如果写过TypeScript,上手ArkTS会非常快。

核心特点:

  • 静态类型检查——编译时就能发现类型错误
  • 声明式UI——描述界面长什么样,不用管怎么画
  • 状态驱动——数据变了,界面自动更新
  • 与OpenHarmony深度集成——直接调用系统API

我在项目中遇到过不少从Java转过来的开发者,他们最不习惯的就是声明式UI。但用上之后都说:回不去了。

3.2 变量与数据类型:给数据一个家

ArkTS的变量声明和TypeScript几乎一样。你只需要记住三个关键字:let、const、var。但我建议你只用前两个,var的坑太多了。

// 基本声明
let name: string = '鸿蒙应用'
const version: number = 3.0
let isReady: boolean = true

// 类型推断——ArkTS会自动推导类型
let appName = '我的应用'  // 自动推断为string
// appName = 123  // 这行会报错,因为类型已经固定

ArkTS支持的数据类型,我整理了一张表,你写代码时可以参考:

类型 说明 示例
number 数字,包括整数和浮点数 let age: number = 25
string 字符串 let msg: string = 'Hello'
boolean 布尔值 let flag: boolean = false
Array 数组 let list: number[] = [1, 2, 3]
object 对象 let user: object = {name: 'Tom'}
undefined 未定义 let x: undefined
null 空值 let y: null = null

避坑指南:我曾经在项目里犯过一个低级错误——用==比较两个数字,结果类型转换导致逻辑出错。记住,ArkScript里永远用===和!==,别用==和!=。

3.3 函数定义:让代码动起来

函数是代码的基本组织单元。ArkTS的函数定义很灵活,你可以用多种方式写。

// 标准函数定义
function greet(name: string): string {
  return `你好,${name}!`
}

// 箭头函数——我比较喜欢这种写法
const add = (a: number, b: number): number => {
  return a + b
}

// 可选参数
function buildUrl(base: string, path?: string): string {
  return path ? `${base}/${path}` : base
}

// 默认参数
function createUser(name: string, age: number = 18): object {
  return { name, age }
}

你想想看,为什么要有可选参数?因为实际开发中,很多参数不是每次都要传的。比如用户头像,不是每个人都有,用可选参数就很合适。

个人经验:我建议你尽量用箭头函数。它没有自己的this绑定,在回调场景下不会出现this指向混乱的问题。我在项目中吃过这个亏,后来就全面改用箭头函数了。

3.4 类与接口:面向对象的基础

ArkTS支持完整的面向对象编程。类用来创建对象,接口用来定义契约。

// 定义一个接口
interface User {
  id: number
  name: string
  age?: number  // 可选属性
  sayHello(): void
}

// 实现接口的类
class Student implements User {
  id: number
  name: string
  age?: number
  private grade: string  // 私有属性

  constructor(id: number, name: string, grade: string) {
    this.id = id
    this.name = name
    this.grade = grade
  }

  sayHello(): void {
    console.log(`我是${this.name},来自${this.grade}班`)
  }

  // 静态方法
  static createGuest(): Student {
    return new Student(0, '访客', '未知')
  }
}

// 使用
const stu = new Student(1, '小明', '三年级')
stu.sayHello()

接口的好处是什么?它让你写代码时有个「合同」。你只要保证类实现了接口,调用方就不用关心具体实现。这在团队协作中特别有用。

我记得有一次重构代码,就是因为前期接口定义得好,改起来几乎没费什么劲。要是没有接口,那改一个地方得翻遍整个项目。

3.5 模块化开发:把代码拆开管理

一个应用不可能写在一个文件里。模块化就是让你把代码拆成多个文件,每个文件只负责一件事。

// mathUtils.ets —— 导出模块
export function add(a: number, b: number): number {
  return a + b
}

export const PI = 3.14159

export class Calculator {
  result: number = 0
  add(value: number): void {
    this.result += value
  }
}

// main.ets —— 导入模块
import { add, PI, Calculator } from './mathUtils'

console.log(add(1, 2))  // 输出 3
console.log(PI)         // 输出 3.14159

const calc = new Calculator()
calc.add(10)
console.log(calc.result)  // 输出 10

ArkTS的模块化有几个要点:

  • 用export导出,用import导入
  • 可以导出变量、函数、类、接口
  • 支持默认导出和命名导出
  • 文件扩展名通常是.ets

我的建议:一个文件不要超过200行。如果超过了,说明这个文件做的事情太多了,该拆了。我在项目里见过一个3000行的文件,那维护起来简直是噩梦。

3.6 知识体系总览

下面这张图把本章的核心知识点串起来了。你可以把它当作一张地图,写代码时随时回来看看。

ArkTS 语言基础知识体系 ArkTS 语言基础 简介与特性 变量与数据类型 函数定义 类与接口 模块化开发 声明式UI 状态管理 类型推断 箭头函数 可选参数 接口契约 私有属性 export/import 文件拆分 提示:每个分支都对应一个核心知识点,建议按顺序学习,先掌握基础再深入

3.7 本章小结

这一章我们走了一遍ArkTS的核心基础。你不需要一次性全记住,但至少要有个印象:

  • ArkTS是TypeScript的超集,加了声明式UI
  • 变量声明用let和const,类型要明确
  • 函数用箭头函数写,参数可以设默认值
  • 类实现接口,接口定义契约
  • 模块化就是拆文件,一个文件只做一件事