cursorrules.mdc 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. ---
  2. description:
  3. globs:
  4. alwaysApply: true
  5. ---
  6. # 鸿蒙ArkTS编程规则与最佳实践
  7. ## 语法差异规则:ArkTS vs TypeScript
  8. ### 1. 空值检查规则
  9. ```typescript
  10. // ❌ 错误: 未对可能为null的对象执行检查
  11. this.dbObject.executeSql(sql);
  12. // ✅ 正确: 执行null检查
  13. if (this.dbObject) {
  14. this.dbObject.executeSql(sql);
  15. }
  16. ```
  17. ### 2. 解构赋值规则
  18. ```typescript
  19. // ❌ 错误: ArkTS不支持解构赋值语法
  20. for (const [key, value] of Object.entries(obj)) {
  21. // 处理逻辑
  22. }
  23. // ✅ 正确: 使用传统循环方式
  24. const keys = Object.keys(obj);
  25. for (let i = 0; i < keys.length; i++) {
  26. const key = keys[i];
  27. const value = obj[key];
  28. // 处理逻辑
  29. }
  30. ```
  31. ### 3. 异步API调用规则
  32. ```typescript
  33. // ❌ 错误: 回调参数类型不匹配
  34. dbStore.executeSql(sql, (err, result: ResultSet) => {
  35. // 处理逻辑
  36. });
  37. // ✅ 正确: 使用Promise模式
  38. dbStore.executeSql(sql)
  39. .then(() => {
  40. // 成功处理
  41. })
  42. .catch((err: Error) => {
  43. // 错误处理
  44. console.log(err.message);
  45. });
  46. ```
  47. ### 4. 计算属性名规则
  48. ```typescript
  49. // ❌ 错误: 不支持计算属性名语法
  50. const obj = { [CONSTANT.KEY]: value };
  51. // ✅ 正确: 使用对象属性赋值语法
  52. const obj = {};
  53. obj[CONSTANT.KEY] = value;
  54. ```
  55. ### 5. 数据类型规则
  56. ```typescript
  57. // ❌ 错误: 使用any或未指定泛型类型
  58. const items = new Set();
  59. const map = new Map();
  60. // ✅ 正确: 明确指定泛型类型
  61. const items = new Set<string>();
  62. const map = new Map<string, number>();
  63. ```
  64. ### 6. 错误对象类型规则
  65. ```typescript
  66. // ❌ 错误: 使用隐式any类型的错误对象
  67. try {
  68. // 代码
  69. } catch (e) {
  70. console.log(`错误: ${e}`);
  71. }
  72. // ✅ 正确: 明确指定错误对象的类型
  73. try {
  74. // 代码
  75. } catch (e: Error) {
  76. console.log(`错误: ${e.message}`);
  77. }
  78. ```
  79. ## 数据库操作最佳实践
  80. ### 1. 表结构升级
  81. ```typescript
  82. // ❌ 错误: 依赖回调处理的表结构升级
  83. this.rdbStore.executeSql(tableInfoQuery, (err, result) => {
  84. // 处理逻辑
  85. });
  86. // ✅ 正确: 使用Promise模式并独立处理每个列的添加操作
  87. this.rdbStore.executeSql(tableInfoQuery)
  88. .then(() => {
  89. // 为每个需要添加的列单独执行ALTER TABLE
  90. Object.keys(columnsToAdd).forEach(column => {
  91. const type = columnsToAdd[column];
  92. this.rdbStore.executeSql(`ALTER TABLE ${tableName} ADD COLUMN ${column} ${type}`)
  93. .then(() => { /* 成功处理 */ })
  94. .catch((err: Error) => { /* 错误处理 */ });
  95. });
  96. });
  97. ```
  98. ### 2. 资源释放
  99. ```typescript
  100. // ❌ 错误: 未关闭ResultSet
  101. this.rdbStore.query(predicates, (resultSet) => {
  102. // 处理逻辑
  103. });
  104. // ✅ 正确: 确保关闭ResultSet
  105. this.rdbStore.query(predicates, (resultSet) => {
  106. try {
  107. // 处理逻辑
  108. } finally {
  109. resultSet.close();
  110. }
  111. });
  112. ```
  113. ## 对象字面量规则
  114. ### 1. 复杂对象初始化
  115. ```typescript
  116. // ❌ 错误: 不支持复杂对象字面量初始化
  117. const config = {
  118. complex: {
  119. nested: {
  120. value: someValue
  121. }
  122. }
  123. };
  124. // ✅ 正确: 分步创建复杂对象
  125. const config = {};
  126. config.complex = {};
  127. config.complex.nested = {};
  128. config.complex.nested.value = someValue;
  129. ```
  130. ## 命名规范
  131. - 类名: PascalCase (例如 MediaTable)
  132. - 方法名: camelCase (例如 queryByParentPath)
  133. - 常量: UPPER_SNAKE_CASE (例如 DB_COLUMNS.FILE_PATH)
  134. - 私有属性: _camelCase (例如 _dbStore)