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

一、 变量与基础类型(数据的容器)
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() { … } // ❌ 报错:只能有一个根节点 }
#与鸿蒙共赴星光之约#
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...


