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 知识体系总览
下面这张图把本章的核心知识点串起来了。你可以把它当作一张地图,写代码时随时回来看看。
3.7 本章小结
这一章我们走了一遍ArkTS的核心基础。你不需要一次性全记住,但至少要有个印象:
- ArkTS是TypeScript的超集,加了声明式UI
- 变量声明用
let和const,类型要明确 - 函数用箭头函数写,参数可以设默认值
- 类实现接口,接口定义契约
- 模块化就是拆文件,一个文件只做一件事