Harmony开发之ArkTS语言入门——当TypeScript遇见HarmonyOS

引入:从JavaScript到ArkTS的演进之路

如果你是前端开发者,对JavaScript和TypeScript一定不陌生。ArkTS正是基于TypeScript扩展而来的语言,专为HarmonyOS应用开发设计。它继承了TypeScript的静态类型检查、面向对象等特性,同时针对移动端和分布式场景进行了深度优化。

ArkTS的出现解决了JavaScript在大型应用开发中的痛点:类型缺失导致运行时错误频发、代码可维护性差、缺乏面向对象支持等。通过静态类型系统,ArkTS能够在编译阶段就发现潜在问题,大大提升了开发效率和代码质量。

讲解:ArkTS核心特性与语法精讲

基础语法:从变量到函数

变量声明与类型注解

// 基础类型
let name: string = '张三'  // 字符串
let age: number = 25      // 数字
let isStudent: boolean = true  // 布尔值
let hobbies: string[] = ['编程', '阅读']  // 数组

// 联合类型
let score: number | string = 90
score = '优秀'  // 合法

// 类型推断
let message = 'Hello'  // 自动推断为string类型

函数定义

// 基础函数
function greet(name: string): string {
  return `Hello, ${name}!`
}

// 箭头函数
const add = (a: number, b: number): number => a + b

// 可选参数和默认值
function createUser(name: string, age?: number, isActive: boolean = true): void {
  console.log(`用户: ${name}, 年龄: ${age || '未知'}, 状态: ${isActive}`)
}

面向对象编程:类与接口

类定义

class Person {
  // 成员变量
  name: string
  age: number
  private id: number  // 私有属性

  // 构造函数
  constructor(name: string, age: number) {
    this.name = name
    this.age = age
    this.id = Math.random()
  }

  // 方法
  introduce(): string {
    return `我叫${this.name}, 今年${this.age}岁`
  }

  // 静态方法
  static createAnonymous(): Person {
    return new Person('匿名', 0)
  }
}

// 使用类
const person = new Person('李四', 30)
console.log(person.introduce())

接口定义

// 定义接口
interface User {
  id: number
  name: string
  email?: string  // 可选属性
  readonly createTime: Date  // 只读属性
}

// 实现接口
const user: User = {
  id: 1,
  name: '王五',
  createTime: new Date()
}

// user.createTime = new Date()  // 错误,只读属性不能修改

装饰器:ArkTS的核心特性

装饰器是ArkTS的重要特性,用于增强类、方法、属性等:

@Entry装饰器

@Entry  // 标识为页面入口组件
@Component
struct Index {
  // 组件内容
}

@Component装饰器

@Component  // 标识为自定义组件
struct MyComponent {
  build() {
    // 构建UI
  }
}

状态管理装饰器

@Component
struct Counter {
  @State count: number = 0  // 响应式状态
  @Prop title: string        // 父组件传递的属性

  build() {
    Column() {
      Text(`${this.title}: ${this.count}`)
      Button('+1')
        .onClick(() => {
          this.count++  // 修改状态,UI自动更新
        })
    }
  }
}

模块化与导入导出

导出模块

// utils.ts
export function formatDate(date: Date): string {
  return date.toLocaleDateString()
}

export const PI = 3.14159

// 默认导出
export default class Calculator {
  static add(a: number, b: number): number {
    return a + b
  }
}

导入模块

// 导入指定成员
import { formatDate, PI } from './utils'

// 导入默认导出
import Calculator from './utils'

// 导入全部
import * as Utils from './utils'

// 使用
const today = formatDate(new Date())
const result = Calculator.add(1, 2)

泛型:提高代码复用性

// 泛型函数
function identity<T>(arg: T): T {
  return arg
}

const num = identity<number>(123)  // 类型为number
const str = identity<string>('hello')  // 类型为string

// 泛型接口
interface Result<T> {
  data: T
  success: boolean
}

const userResult: Result<User> = {
  data: { id: 1, name: '张三' },
  success: true
}

const listResult: Result<string[]> = {
  data: ['a', 'b', 'c'],
  success: true
}

异步编程:Promise与async/await

// Promise基础
function fetchData(): Promise<string> {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('数据加载成功')
    }, 1000)
  })
}

fetchData()
  .then(data => console.log(data))
  .catch(error => console.error(error))

// async/await
async function loadData(): Promise<void> {
  try {
    const data = await fetchData()
    console.log(data)
  } catch (error) {
    console.error('加载失败', error)
  }
}

类型守卫与类型断言

// 类型守卫
function isString(value: any): value is string {
  return typeof value === 'string'
}

function processValue(value: string | number): void {
  if (isString(value)) {
    console.log(value.toUpperCase())  // 这里value是string类型
  } else {
    console.log(value.toFixed(2))  // 这里value是number类型
  }
}

// 类型断言
const someValue: any = 'hello'
const strLength = (someValue as string).length  // 断言为string类型

实战案例:用户信息卡片组件

// 定义用户接口
interface UserInfo {
  id: number
  name: string
  avatar: string
  age?: number
  email: string
}

@Component
struct UserCard {
  @Prop user: UserInfo  // 从父组件传递的用户信息
  @State isExpanded: boolean = false

  // 格式化年龄显示
  private formatAge(age?: number): string {
    return age ? `${age}岁` : '年龄未知'
  }

  build() {
    Column({ space: 10 }) {
      // 头像和姓名
      Row({ space: 10 }) {
        Image(this.user.avatar)
          .width(50)
          .height(50)
          .borderRadius(25)
        Column() {
          Text(this.user.name)
            .fontSize(18)
            .fontWeight(FontWeight.Bold)
          Text(this.formatAge(this.user.age))
            .fontSize(14)
            .fontColor('#666')
        }
      }

      // 详细信息(条件渲染)
      if (this.isExpanded) {
        Column({ space: 5 }) {
          Text(`邮箱: ${this.user.email}`)
            .fontSize(14)
          Text(`ID: ${this.user.id}`)
            .fontSize(12)
            .fontColor('#999')
        }
      }

      // 展开/收起按钮
      Button(this.isExpanded ? '收起' : '展开')
        .onClick(() => {
          this.isExpanded = !this.isExpanded
        })
    }
    .padding(15)
    .backgroundColor(Color.White)
    .borderRadius(8)
    .shadow({ radius: 5, color: '#00000010' })
  }
}

// 使用组件
@Entry
@Component
struct UserList {
  @State users: UserInfo[] = [
    { id: 1, name: '张三', avatar: 'avatar1.png', age: 25, email: 'zhangsan@example.com' },
    { id: 2, name: '李四', avatar: 'avatar2.png', email: 'lisi@example.com' }
  ]

  build() {
    Column({ space: 15 }) {
      ForEach(this.users, (user) => {
        UserCard({ user: user })
      })
    }
    .padding(20)
  }
}

总结:ArkTS的核心价值与学习建议

核心特性回顾

  1. 静态类型系统:编译时类型检查,减少运行时错误
  2. 面向对象支持:类、接口、继承等完整特性
  3. 装饰器机制:简化UI组件和状态管理
  4. 模块化设计:支持ES6模块化,代码组织更清晰
  5. 类型推断:减少类型注解,保持代码简洁

学习建议

初学者路线

  1. 先掌握基础语法(变量、函数、类型)
  2. 学习面向对象概念(类、接口、继承)
  3. 理解装饰器的作用和使用场景
  4. 掌握模块化开发方式

进阶学习

  1. 泛型编程提高代码复用性
  2. 异步编程处理网络请求等场景
  3. 类型守卫和类型断言提升类型安全
  4. 装饰器的高级用法(自定义装饰器)

常见问题与解决方案

问题1:类型错误频繁

  • 解决方案:开启严格模式,充分利用类型检查

问题2:装饰器语法不熟悉

  • 解决方案:先理解内置装饰器(@State、@Prop、@Link),再学习自定义装饰器

问题3:模块化组织混乱

  • 解决方案:遵循单一职责原则,合理拆分模块

下一步学习方向

在掌握了ArkTS基础后,建议继续学习:

  • ArkUI声明式开发:结合ArkTS实现UI开发
  • HarmonyOS API:调用系统能力(网络、存储、设备等)
  • 分布式开发:跨设备数据同步与能力调用
  • 性能优化:内存管理、渲染优化等高级技巧

ArkTS作为HarmonyOS应用开发的核心语言,掌握它将为你打开全场景应用开发的大门。建议多动手实践,通过实际项目加深理解,逐步掌握这门现代化开发语言。

posted @ 2025-12-24 10:30  wrystart  阅读(2)  评论(0)    收藏  举报