一、前言:为什么必须学懂ArkTS基础语法?

很多前端转鸿蒙、鸿蒙新手开发的通病:只会抄UI代码、不懂底层语法规范

写代码全靠TS/JS旧习惯,最终出现大量编译报错、类型红线、页面闪退、架构混乱问题。

ArkTS 作为鸿蒙 静态强类型、编译型、规范化主力语言,和松散的JS、半规范的TS完全不同:它没有类型逃逸、没有动态容错、语法规则严格固化

本文一次性吃透 变量常量、作用域、基础类型、推导/断言、数组/元组/枚举、联合类型、Interface、类型别名、泛型基础 全套核心语法,所有案例均为鸿蒙工程可直接运行标准代码,零基础也能系统掌握ArkTS工程化写法。

二、变量、常量与核心命名规范

1. 变量 let(可读写)

ArkTS 强制使用 let 声明块级变量,完全废弃var,杜绝变量提升、全局污染问题。变量允许二次赋值,但不允许跨类型赋值(静态强类型特性)。


// 显式类型声明(推荐工程写法)
let count: number = 0;
count = 10; // 合法二次赋值

// 禁止跨类型赋值(编译直接报错)
// count = "10"; 

2. 常量 const(只读不可改)

const 声明只读常量,声明时必须初始化赋值,后续不允许二次修改,适合固定配置、枚举值、接口地址、静态文本等场景。


const APP_NAME: string = "鸿蒙实战项目";
const BASE_URL: string = "https://api.harmonyos.com";

// 报错:常量不可二次赋值
// APP_NAME = "新名称";

3. 工程命名规范

  • 变量/常量:小驼峰userName

  • 枚举/接口/类型:大驼峰 UserInfo

  • 全局常量:全大写下划线 BASE_URL

三、作用域、块级作用域(ArkTS核心特性)

1. 全局作用域

写在页面顶层、函数外部的变量/常量,整页所有函数、组件均可访问,建议仅用于全局配置、全局状态,禁止滥用。

2. 块级作用域(重点)

ArkTS 100%严格块级作用域:let/const 仅在当前 {} 代码块内生效,外部完全无法访问,彻底解决JS变量穿透污染问题。


if (true) {
  let msg: string = "块内变量";
  const num: number = 99;
  console.log(msg);
}

// 报错:msg、num 块外无法访问
// console.log(msg);

3. 函数作用域

函数内部声明的变量,仅函数内部可用,调用结束自动销毁,无内存残留。

ArkTS 强规范总结:无var、无变量提升、无作用域穿透,所有变量作用域边界绝对清晰

四、ArkTS 基础数据类型(无any、零类型逃逸)

ArkTS 摒弃TS所有动态特性,禁用 any / unknown,所有数据类型必须精准、确定,是稳定性与性能的核心保障。

1. 八大基础原生类型

类型

作用

示例

string

字符串文本

let str: string = "鸿蒙"

number

整数/浮点数统一数值类型

let num: number = 3.14

boolean

布尔真假

let flag: boolean = true

null

空值

let n: null = null

undefined

未定义

let u: undefined = undefined

void

函数无返回值

function fn(): void {}

never

永不返回、死循环/报错函数

异常终止函数专用

2. 核心注意点(区别TS/JS)

  • 不支持隐式类型转换:数字、字符串、布尔不能自动互转

  • 空值必须显式定义,禁止隐性空指针

  • 完全禁用 any,杜绝类型逃逸导致的线上bug

五、类型推导、类型断言(高频实战用法)

1. 类型推导(自动推断类型)

ArkTS 虽是强类型,但支持初始化赋值自动推导类型,简化代码且不牺牲规范性,是工程最常用写法。


// 自动推导为 string
let title = "ArkTS类型推导";
// 自动推导为 number
let age = 20;
// 自动推导为 boolean
let isOpen = false;

// 推导后禁止赋值其他类型
// title = 123; // 编译报错

规范建议:简单变量可依赖推导,接口参数、返回值、复杂数据必须显式声明类型

2. 类型断言(手动确定类型)

当编译器无法精准识别类型、或开发者明确知晓数据类型时,使用类型断言手动锁定类型,不会改变运行时数据,仅用于编译期类型校验。

语法:值 as 类型


// 模拟后端返回未知数据
let res: string | number = "100";

// 断言为字符串,调用字符串方法
let len = (res as string).length;
console.log(len);

避坑:禁止滥用断言掩盖类型错误,断言是「精准类型锁定」,不是「类型逃逸兜底」。

六、复合数据类型:数组、元组、枚举

1. 数组 Array(同类型有序集合)

ArkTS 数组强类型约束:仅可存储声明的单一类型数据,禁止混合类型,支持两种定义方式。


// 写法1:类型[]
let numArr: number[] = [1, 2, 3];
// 写法2:泛型Array
let strArr: Array<string> = ["鸿蒙", "ArkTS"];

// 报错:不允许混入其他类型
// numArr.push("4");

2. 元组 Tuple(固定长度、固定类型)

元组是精准约束位置+类型+长度的特殊数组,适配坐标、键值对等结构化短数据场景,是TS/JS弱类型不具备的强规范特性。


// 坐标:[经度, 纬度] 两个number固定位置
let position: [number, number] = [116.4, 39.9];

// 键值对:[名称, 状态]
let statusItem: [string, boolean] = ["开启", true];

// 报错:长度、类型不匹配
// position = [116.4];
// position = ["116", 39.9];

3. 枚举 Enum(固定常量集合)

枚举用于定义有限、固定、语义化的常量集合,替代魔法数字/魔法字符串,大幅提升代码可读性与可维护性,适配状态、类型、权限场景。

数字枚举(默认自增)

enum OrderStatus {
  PENDING,    // 0
  PAYED,      // 1
  FINISH,     // 2
  CANCEL      // 3
}
let status: OrderStatus = OrderStatus.PENDING;
字符串枚举(业务首选)

enum Direction {
  UP = "UP",
  DOWN = "DOWN",
  LEFT = "LEFT",
  RIGHT = "RIGHT"
}

七、高级类型:联合类型、类型别名

1. 联合类型(多类型兼容)

联合类型表示一个变量可兼容多种指定类型,替代TS的any逃逸,实现「灵活但可控」的类型适配。


// 支持字符串/数字两种类型
let id: string | number;
id = 1001;
id = "1001_01";

// 状态联合类型
type Status = "success" | "fail" | "loading";
let reqStatus: Status = "loading";

2. 类型别名 type(简化复杂类型)

使用 type 给复杂类型、联合类型、元组类型起别名,简化代码、统一复用。


// 联合类型别名
type NumStr = number | string;
let uid: NumStr = 2026;

// 元组类型别名
type Point = [number, number];
let p1: Point = [10, 20];

type 与 interface 区别:type 适合别名、联合、元组;interface 适合结构化对象、可扩展、可继承。

八、Interface 接口(ArkTS核心数据模型)

Interface 是 ArkTS 构建结构化数据、实体模型、页面参数的核心,强制对象结构固定,禁止动态增删属性,是鸿蒙工程化的基石。

1. 基础接口定义


interface UserInfo {
  id: number;        // 必选字段
  userName: string;
  age?: number;      // 可选字段
  readonly createTime: string; // 只读字段
}

// 严格匹配结构
let user: UserInfo = {
  id: 1001,
  userName: "鸿蒙开发者",
  createTime: "2026-07-01"
};

2. 接口特性(区别TS)

  • 结构绝对固定:禁止运行时动态新增/删除属性

  • 支持可选字段、只读字段,精准约束数据结构

  • 支持接口继承、多接口合并,适配复杂业务模型

3. 接口继承


interface BaseModel {
  id: number;
  updateTime: string;
}

// 继承基础模型,扩展用户字段
interface UserModel extends BaseModel {
  nickname: string;
  phone: string;
}

九、泛型基础 Generic(通用类型复用)

泛型是 类型参数化 核心能力,解决「同一逻辑多类型重复编写」问题,实现类型安全的代码复用,是封装工具方法、通用组件、通用网络请求的必备能力。

1. 泛型基础语法


// T 为泛型占位符,代表任意合法类型
function getValue<T>(val: T): T {
  return val;
}

// 自动推导类型
getValue(100);
getValue("鸿蒙泛型");

2. 泛型约束(重点实战)

通过 extends 限制泛型范围,避免任意类型,保证类型安全。

// 约束:必须是字符串/数字
function printNumStr<T extends number | string>(val: T): void {
  console.log(val);
}

printNumStr(666);
printNumStr("ArkTS");

3. 泛型数组、泛型接口实战


// 通用接口返回体
interface ResModel<T> {
  code: number;
  data: T;
  msg: string;
}

// 用户数据返回
let userRes: ResModel<UserInfo> = {
  code: 200,
  data: { id: 1001, userName: "测试", createTime: "2026-07-01" },
  msg: "success"
};

十、全文总结

1. 变量常量+作用域:ArkTS 严格块级作用域,let/const 规范声明,无变量污染,边界清晰。

2. 类型系统核心:静态强类型、禁用any、支持类型推导与断言,兼顾简洁与安全。

3. 复合数据能力:数组、元组、枚举分别适配批量数据、结构化短数据、固定状态场景。

4. 高级类型工程化:联合类型、类型别名灵活适配多类型场景,Interface标准化数据模型。

5. 泛型实现类型安全的代码复用,是封装通用工具、组件、网络层的核心基础。

Logo

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

更多推荐