ArkTS 核心语法和注意问题

Minimax M2 写鸿蒙应用,总会用上JS/TS的写法,再去修改错误特别麻烦,所以积累一些常见错误,让大模型别写错。

核心语法

ArkTS 核心语法和注意问题

一、 变量与基础类型(数据的容器)

1. 声明方式

  • let:变量,值可以变。
  • const:常量,值定了就不能动。

2. 关键数据类型

ArkTS 是静态类型语言,每个变量出生时必须贴上标签(类型)。

  • number:不分整数小数,统统是 number。
  • string:文字。支持模板字符串(反引号 ),如 Hello ${name}`。
  • boolean:true / false。
    • 注意:ArkTS 的条件判断(如 if)里必须是严格的 boolean。不能像 JS 那样写 if (object) 来判断对象是否存在,必须写 if (object != null)。
  • Union (联合类型)高频出现
    • 写法:string | number | null。
    • 含义:这个变量既可以是字,也可以是数,还可以是空。
    • 注意:如果把一个 string | null 的变量直接当 string 用,IDE 会标红,需要加判空逻辑。

二、 函数(动作的指令)

1. 写法

  • 箭头函数(Lambda):() => { … }。
  • 注意:在 UI 组件的事件回调(列如点击事件 onClick)里,AI 超级喜爱用箭头函数,这是对的。
  • 参数类型:必须明确写出类型,如 function add(x: number, y: number)。

2. 限制

  • 作用域:函数里面的变量外面拿不到。

三、 类(Class):对象的蓝图

这是报错的重灾区。ArkTS 对类的要求极其严格。

1. 初始化地狱

  • 规则:类里面的字段(Field),要么在声明时赋值,要么在 constructor 里赋值。
  • 注意
    • 错误示范:class Person { name: string; } (报错:未初始化)。
    • 正确示范:class Person { name: string = ''; } (给个默认值)或者 name?: string (声明它可能是空的)。

2. 可见性(谁能看)

  • private:私有的,只有自己能用。
  • public:公开的。
  • 注意:如果在外部调用了一个 private 的属性,IDE 会报错。

3. this 关键字

  • 只能在类的实例方法里用,指向当前对象。
  • 注意:箭头函数里的 this 指向和普通函数不同,如果写代码时 this 报错,一般是作用域搞错了。

四、 空安全(Null Safety):消灭崩溃的根源

这是遇到“Object is possibly null”报错的缘由。

1. 严格模式

  • 默认情况下,变量不能为空(null/undefined)。

2. 两个救命符号

? (可选/空值)

  • name?: string 表明 name 可以是字串,也可以没有。
  • user?.name 表明“如果 user 存在,就取 name;如果 user 不存在,就不动(也不报错)”。

! (非空断言)

  • user!.name 表明“我向编译器发誓,user 绝对不为空,你闭嘴别报错了”。
  • 监工注意:当 IDE 报“可能为空”的红线时,如果你确定它有值,可以让 AI 加个 !,或者加个 if 判断。

3. ?? (空值合并)

  • a ?? b:如果 a 是空的,就用 b。常用于设置默认值。

五、 模块化(文件之间的借还)

解决“Cannot find name”的问题。

export:把这个文件里的东西(类、函数)暴露出去,别人才能用。

import:把别的文件里的东西拿进来。

注意:

  • 如果写了一个组件 MyComponent,在另一个页面用不了,一般是由于忘了在定义 MyComponent 的地方写 export。
  • 如果报错 Module not found,一般是路径写错了(列如 ../ 层级不对)。

六、 注解(Annotations):给代码贴标签

@Entry:告知系统“这是个页面入口”。

@Component:告知系统“这是个自定义组件”。

@State:告知系统“这个变量变了,界面要跟着刷新”。

注意:每一个 .ets 页面文件,必须且只能有一个 @Entry。如果给两个组件都加了 @Entry,或者一个都没加,都会报错。

实践问题

问题一:对象的严格限制

1. 禁止随意定义对象字面量

  • JavaScript 习惯:const config = { color: 'red', size: 10 }; (ArkTS ❌ 报错)
  • ArkTS 规矩:必须先定义类型(类或接口),或者是显式类型标注。
  • 最佳实践:定义常量时,不要用对象,要用 Class + static readonly
    • 例子:把 export const Colors = { Red: '#F00' } 改为 export class Colors { static readonly Red = '#F00'; }。

2. 禁止对象展开运算符 (…)

  • JavaScript 习惯:const newObj = { …oldObj, name: 'New' }; (ArkTS ❌ 报错:arkts-no-spread)
  • ArkTS 规矩:不支持对对象使用 …(数组可以)。
  • 解决办法
    • 笨办法:手动赋值。newObj.name = 'New'; newObj.age = oldObj.age;
    • 深拷贝大法:JSON.parse(JSON.stringify(oldObj)) (虽然性能一般,但在处理复杂数据恢复时很管用)。

问题二:泛型与集合的洁癖

1. 泛型参数必须有名有姓

  • 错误示范:let map = new Map(); (ArkTS ❌ 报错:不能用字面量做泛型类型)
  • ArkTS 规矩:泛型里不能写 { … } 这种匿名结构。
  • 解决办法:必须先定义一个 class 或 interface。
    • class UserInfo { age: number = 0 } let map = new Map(); // ✅

问题三:ArkUI 布局的“大括号”陷阱

1. 链式调用的位置

  • 铁律:.width()、.height() 等属性方法,只能跟在 组件 的屁股后面(即 Column() {…} 的右大括号后面)。
  • 禁区:绝对不能跟在 if/else 的大括号后面,也不能跟在普通逻辑代码后面。

2. @Entry 的唯一根节点

  • 规则:一个 @Entry 页面,build() 函数里只能有一个根容器(一般是 Column、Stack 或 Row)。
  • 错误
    • build() { Column() { … } Column() { … } // ❌ 报错:只能有一个根节点 }

#与鸿蒙共赴星光之约#

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...