deveco-harness 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.en.md +71 -0
  2. package/README.md +71 -0
  3. package/deveco-harness.example.jsonc +32 -0
  4. package/dist/index.js +758 -0
  5. package/package.json +48 -0
  6. package/prompts/build.txt +164 -0
  7. package/prompts/plan.txt +118 -0
  8. package/skills/arkts-error-fixes/README.md +151 -0
  9. package/skills/arkts-error-fixes/SKILL.md +150 -0
  10. package/skills/arkts-error-fixes/assets/AnyTypeError.ets +269 -0
  11. package/skills/arkts-error-fixes/assets/AppStorageError.ets +22 -0
  12. package/skills/arkts-error-fixes/assets/ArrowFunctionConversionError.ets +42 -0
  13. package/skills/arkts-error-fixes/assets/AvoidAreaTypeError.ets +43 -0
  14. package/skills/arkts-error-fixes/assets/BreakpointTypeError.ets +71 -0
  15. package/skills/arkts-error-fixes/assets/CatchClauseTypeError.ets +54 -0
  16. package/skills/arkts-error-fixes/assets/ColorConsistencyError.ets +88 -0
  17. package/skills/arkts-error-fixes/assets/ColorPropertyError.ets +39 -0
  18. package/skills/arkts-error-fixes/assets/ContextTypeError.ets +105 -0
  19. package/skills/arkts-error-fixes/assets/DecoratorStateError.ets +64 -0
  20. package/skills/arkts-error-fixes/assets/DisplayListenerTypeError.ets +129 -0
  21. package/skills/arkts-error-fixes/assets/DuplicateEntryError.ets +35 -0
  22. package/skills/arkts-error-fixes/assets/ESObjectTypeError.ets +137 -0
  23. package/skills/arkts-error-fixes/assets/FontColorPropertyError.ets +42 -0
  24. package/skills/arkts-error-fixes/assets/FunctionReturnTypeError.ets +41 -0
  25. package/skills/arkts-error-fixes/assets/IDataSourceError.ets +79 -0
  26. package/skills/arkts-error-fixes/assets/ImplementationNotAllowedError.ets +38 -0
  27. package/skills/arkts-error-fixes/assets/InterfaceMethodSignatureError.ets +43 -0
  28. package/skills/arkts-error-fixes/assets/NotificationError.ets +34 -0
  29. package/skills/arkts-error-fixes/assets/ObjectLiteralInterfaceError.ets +49 -0
  30. package/skills/arkts-error-fixes/assets/ObjectLiteralTypeError.ets +54 -0
  31. package/skills/arkts-error-fixes/assets/ObjectSpreadError.ets +29 -0
  32. package/skills/arkts-error-fixes/assets/PossiblyNullError.ets +32 -0
  33. package/skills/arkts-error-fixes/assets/ResourceConversionError.ets +159 -0
  34. package/skills/arkts-error-fixes/assets/StandaloneFunctionContext.ets +116 -0
  35. package/skills/arkts-error-fixes/assets/StandaloneFunctionError.ets +85 -0
  36. package/skills/arkts-error-fixes/assets/StorageLinkDefaultError.ets +41 -0
  37. package/skills/arkts-error-fixes/assets/TitleButtonRectTypeError.ets +86 -0
  38. package/skills/arkts-error-fixes/assets/UnusedVariableWarning.ets +102 -0
  39. package/skills/arkts-error-fixes/assets/UtilityTypeError.ets +176 -0
  40. package/skills/arkts-error-fixes/assets/WindowRectSizeError.ets +65 -0
  41. package/skills/arkts-error-fixes/assets/WindowTypeError.ets +37 -0
  42. package/skills/arkts-error-fixes/reference/any_type_errors.md +433 -0
  43. package/skills/arkts-error-fixes/reference/appstorage_errors.md +95 -0
  44. package/skills/arkts-error-fixes/reference/arrow_function_conversion_errors.md +163 -0
  45. package/skills/arkts-error-fixes/reference/avoid_area_type_errors.md +59 -0
  46. package/skills/arkts-error-fixes/reference/breakpoint_type_errors.md +122 -0
  47. package/skills/arkts-error-fixes/reference/catch_clause_type_errors.md +89 -0
  48. package/skills/arkts-error-fixes/reference/color_consistency_errors.md +209 -0
  49. package/skills/arkts-error-fixes/reference/color_property_errors.md +136 -0
  50. package/skills/arkts-error-fixes/reference/context_type_errors.md +260 -0
  51. package/skills/arkts-error-fixes/reference/decorator_state_errors.md +109 -0
  52. package/skills/arkts-error-fixes/reference/display_listener_type_errors.md +149 -0
  53. package/skills/arkts-error-fixes/reference/duplicate_entry_errors.md +193 -0
  54. package/skills/arkts-error-fixes/reference/esobject_type_errors.md +110 -0
  55. package/skills/arkts-error-fixes/reference/fontcolor_property_errors.md +104 -0
  56. package/skills/arkts-error-fixes/reference/function_return_type_errors.md +194 -0
  57. package/skills/arkts-error-fixes/reference/idata_source_errors.md +77 -0
  58. package/skills/arkts-error-fixes/reference/implementation_not_allowed_errors.md +191 -0
  59. package/skills/arkts-error-fixes/reference/interface_method_signature_errors.md +143 -0
  60. package/skills/arkts-error-fixes/reference/notification_errors.md +110 -0
  61. package/skills/arkts-error-fixes/reference/object_literal_interface_errors.md +156 -0
  62. package/skills/arkts-error-fixes/reference/object_literal_type_errors.md +110 -0
  63. package/skills/arkts-error-fixes/reference/object_spread_errors.md +105 -0
  64. package/skills/arkts-error-fixes/reference/possibly_null_errors.md +156 -0
  65. package/skills/arkts-error-fixes/reference/resource_conversion_errors.md +154 -0
  66. package/skills/arkts-error-fixes/reference/standalone_function_errors.md +68 -0
  67. package/skills/arkts-error-fixes/reference/storage_link_default_errors.md +124 -0
  68. package/skills/arkts-error-fixes/reference/title_button_rect_type_errors.md +167 -0
  69. package/skills/arkts-error-fixes/reference/unused_variable_warnings.md +295 -0
  70. package/skills/arkts-error-fixes/reference/utility_type_errors.md +290 -0
  71. package/skills/arkts-error-fixes/reference/window_rect_size_errors.md +70 -0
  72. package/skills/arkts-error-fixes/reference/window_type_errors.md +95 -0
  73. package/skills/arkts-grammar-standards/SKILL.md +71 -0
  74. package/skills/arkts-grammar-standards/references/basic-syntax.md +103 -0
  75. package/skills/arkts-grammar-standards/references/restrictions.md +100 -0
  76. package/skills/arkts-grammar-standards/references/topic-aliases.json +93 -0
  77. package/skills/arkts-grammar-standards/references/ts-diff.md +108 -0
  78. package/skills/arkts-runtime-fix/SKILL.md +152 -0
  79. package/skills/arkts-runtime-fix/SKILL_CN.md +123 -0
  80. package/skills/arkts-runtime-fix/evals/evals.json +17 -0
  81. package/skills/arkts-runtime-fix/scripts/collect-hilog.mjs +116 -0
  82. package/skills/arkts-runtime-fix/scripts/collect-hilog.ts +115 -0
  83. package/skills/arkts-runtime-fix/scripts/fetch-faultlog.mjs +117 -0
  84. package/skills/arkts-runtime-fix/scripts/fetch-faultlog.ts +116 -0
  85. package/skills/arkts-runtime-fix/scripts/jscrash-report.mjs +149 -0
  86. package/skills/arkts-runtime-fix/scripts/parse-jscrash-log.mjs +126 -0
  87. package/skills/arkts-runtime-fix/scripts/parse-jscrash-log.ts +126 -0
  88. package/skills/arkts-runtime-fix/scripts/probe-faultlogger.mjs +160 -0
  89. package/skills/arkts-runtime-fix/scripts/probe-faultlogger.ts +160 -0
  90. package/skills/arkts-runtime-fix/scripts/shared/hdc.mjs +107 -0
  91. package/skills/arkts-runtime-fix/scripts/shared/hdc.ts +58 -0
  92. package/skills/arkts-runtime-fix/scripts/shared/jscrash-faultlogger.mjs +143 -0
  93. package/skills/arkts-runtime-fix/scripts/shared/jscrash-faultlogger.ts +148 -0
  94. package/skills/arkts-runtime-fix/scripts/shared/jscrash-parse.mjs +389 -0
  95. package/skills/arkts-runtime-fix/scripts/shared/jscrash-parse.ts +409 -0
  96. package/skills/arkts-runtime-fix/scripts/shared/utils.mjs +27 -0
  97. package/skills/arkts-runtime-fix/scripts/shared/utils.ts +27 -0
  98. package/skills/arkui-knowledge/SKILL.md +90 -0
  99. package/skills/arkui-knowledge/references/api-guardrails.md +60 -0
  100. package/skills/arkui-knowledge/references/common-mistakes.md +119 -0
  101. package/skills/arkui-knowledge/references/component-cookbook.md +135 -0
  102. package/skills/arkui-knowledge/references/ui-quality-checklist.md +36 -0
  103. package/skills/deveco-create-project/SKILL.md +144 -0
  104. package/skills/deveco-create-project/application/AppScope/app.json5 +10 -0
  105. package/skills/deveco-create-project/application/AppScope/resources/base/element/string.json +8 -0
  106. package/skills/deveco-create-project/application/AppScope/resources/base/media/background.png +0 -0
  107. package/skills/deveco-create-project/application/AppScope/resources/base/media/foreground.png +0 -0
  108. package/skills/deveco-create-project/application/AppScope/resources/base/media/layered_image.json +7 -0
  109. package/skills/deveco-create-project/application/build-profile.json5 +42 -0
  110. package/skills/deveco-create-project/application/code-linter.json5 +32 -0
  111. package/skills/deveco-create-project/application/entry/build-profile.json5 +33 -0
  112. package/skills/deveco-create-project/application/entry/hvigorfile.ts +7 -0
  113. package/skills/deveco-create-project/application/entry/obfuscation-rules.txt +23 -0
  114. package/skills/deveco-create-project/application/entry/oh-package.json5 +10 -0
  115. package/skills/deveco-create-project/application/entry/src/main/ets/entryability/EntryAbility.ets +63 -0
  116. package/skills/deveco-create-project/application/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets +31 -0
  117. package/skills/deveco-create-project/application/entry/src/main/ets/pages/Index.ets +38 -0
  118. package/skills/deveco-create-project/application/entry/src/main/module.json5 +50 -0
  119. package/skills/deveco-create-project/application/entry/src/main/resources/base/element/color.json +8 -0
  120. package/skills/deveco-create-project/application/entry/src/main/resources/base/element/float.json +8 -0
  121. package/skills/deveco-create-project/application/entry/src/main/resources/base/element/string.json +16 -0
  122. package/skills/deveco-create-project/application/entry/src/main/resources/base/media/background.png +0 -0
  123. package/skills/deveco-create-project/application/entry/src/main/resources/base/media/foreground.png +0 -0
  124. package/skills/deveco-create-project/application/entry/src/main/resources/base/media/layered_image.json +7 -0
  125. package/skills/deveco-create-project/application/entry/src/main/resources/base/media/startIcon.png +0 -0
  126. package/skills/deveco-create-project/application/entry/src/main/resources/base/profile/backup_config.json +3 -0
  127. package/skills/deveco-create-project/application/entry/src/main/resources/base/profile/main_pages.json +5 -0
  128. package/skills/deveco-create-project/application/entry/src/main/resources/dark/element/color.json +8 -0
  129. package/skills/deveco-create-project/application/hvigor/hvigor-config.json5 +23 -0
  130. package/skills/deveco-create-project/application/hvigorfile.ts +7 -0
  131. package/skills/deveco-create-project/application/oh-package.json5 +10 -0
  132. package/skills/deveco-create-project/scripts/copy-template.mjs +216 -0
  133. package/skills/deveco-create-project/scripts/copy-template.ts +214 -0
  134. package/skills/deveco-create-project/scripts/detect-sdk.mjs +82 -0
  135. package/skills/deveco-create-project/scripts/detect-sdk.ts +95 -0
@@ -0,0 +1,295 @@
1
+ # 未使用变量警告解决方案
2
+
3
+ ## 问题描述
4
+
5
+ 在 HarmonyOS ArkUI 开发中,当函数参数或变量被声明但未使用时,会触发编译警告:
6
+
7
+ ```
8
+ 'scrollState' is declared but its value is never read.
9
+ ```
10
+
11
+ 这个警告提示代码中存在未使用的变量,可能是遗漏了某些逻辑或者参数确实不需要。
12
+
13
+ ## 问题示例
14
+
15
+ ```typescript
16
+ // ❌ 警告:scrollState 参数未使用
17
+ .onDidScroll((scrollOffset: number, scrollState: ScrollState) => {
18
+ this.scrollOffset = scrollOffset;
19
+ })
20
+ ```
21
+
22
+ ## 推荐解决方案
23
+
24
+ ### 方案 1: 使用下划线前缀标记未使用参数
25
+
26
+ ```typescript
27
+ // ✅ 推荐:使用下划线前缀
28
+ .onDidScroll((scrollOffset: number, _scrollState: ScrollState) => {
29
+ this.scrollOffset = scrollOffset;
30
+ })
31
+ ```
32
+
33
+ ### 方案 2: 使用该参数
34
+
35
+ ```typescript
36
+ // ✅ 可选:如果需要使用该参数
37
+ .onDidScroll((scrollOffset: number, scrollState: ScrollState) => {
38
+ this.scrollOffset = scrollOffset;
39
+ this.scrollState = scrollState;
40
+ })
41
+ ```
42
+
43
+ ### 方案 3: 删除未使用的参数
44
+
45
+ ```typescript
46
+ // ✅ 可选:如果确实不需要该参数
47
+ .onDidScroll((scrollOffset: number) => {
48
+ this.scrollOffset = scrollOffset;
49
+ })
50
+ ```
51
+
52
+ ## 下划线前缀约定
53
+
54
+ 在 TypeScript/ArkTS 中,使用下划线 `_` 作为变量名前缀是一种常见的约定,表示该变量是故意未使用的:
55
+
56
+ ```typescript
57
+ // 明确表示 scrollState 参数是故意未使用的
58
+ function example(scrollOffset: number, _scrollState: ScrollState) {
59
+ console.log(scrollOffset);
60
+ // scrollState 不会被使用,但保留参数以保持 API 一致性
61
+ }
62
+ ```
63
+
64
+ ## 迁移步骤
65
+
66
+ ### 1. 识别未使用变量警告
67
+
68
+ ```typescript
69
+ // 查找编译警告中提到的变量
70
+ .onDidScroll((scrollOffset: number, scrollState: ScrollState) => {
71
+ this.scrollOffset = scrollOffset;
72
+ })
73
+ ```
74
+
75
+ ### 2. 添加下划线前缀
76
+
77
+ ```typescript
78
+ // 为未使用的参数添加下划线前缀
79
+ .onDidScroll((scrollOffset: number, _scrollState: ScrollState) => {
80
+ this.scrollOffset = scrollOffset;
81
+ })
82
+ ```
83
+
84
+ ### 3. 或者使用该参数
85
+
86
+ ```typescript
87
+ // 如果确实需要使用该参数
88
+ .onDidScroll((scrollOffset: number, scrollState: ScrollState) => {
89
+ this.scrollOffset = scrollOffset;
90
+ this.scrollState = scrollState;
91
+ })
92
+ ```
93
+
94
+ ## 完整示例
95
+
96
+ ```typescript
97
+ @Entry
98
+ @Component
99
+ struct ScrollExample {
100
+ @State scrollOffset: number = 0;
101
+ @State scrollState: ScrollState = ScrollState.Idle;
102
+ private scroller: Scroller = new Scroller();
103
+
104
+ build() {
105
+ Column() {
106
+ Text(`滚动偏移: ${this.scrollOffset}`)
107
+ .fontSize(16)
108
+ .margin({ bottom: 8 })
109
+
110
+ Text(`滚动状态: ${this.getScrollStateName(this.scrollState)}`)
111
+ .fontSize(16)
112
+ .margin({ bottom: 16 })
113
+
114
+ Scroll(this.scroller) {
115
+ Column() {
116
+ ForEach(Array.from({ length: 50 }), (_: Object, index: number) => {
117
+ Text(`Item ${index + 1}`)
118
+ .fontSize(16)
119
+ .padding(12)
120
+ .margin({ bottom: 8 })
121
+ .backgroundColor('#F5F5F5')
122
+ .borderRadius(4)
123
+ }, (_: Object, index: number) => `${index}`)
124
+ }
125
+ .width('100%')
126
+ }
127
+ .scrollable(ScrollDirection.Vertical)
128
+ .scrollBar(BarState.Auto)
129
+ .onDidScroll((scrollOffset: number, _scrollState: ScrollState) => {
130
+ // 使用下划线前缀标记未使用的 scrollState 参数
131
+ this.scrollOffset = scrollOffset;
132
+ })
133
+ .onDidScroll((scrollOffset: number, scrollState: ScrollState) => {
134
+ // 在需要时使用 scrollState 参数
135
+ this.scrollOffset = scrollOffset;
136
+ this.scrollState = scrollState;
137
+ })
138
+ }
139
+ .width('100%')
140
+ .height('100%')
141
+ .padding(16)
142
+ }
143
+
144
+ private getScrollStateName(state: ScrollState): string {
145
+ switch (state) {
146
+ case ScrollState.Idle:
147
+ return 'Idle';
148
+ case ScrollState.Scroll:
149
+ return 'Scroll';
150
+ case ScrollState.Fling:
151
+ return 'Fling';
152
+ default:
153
+ return 'Unknown';
154
+ }
155
+ }
156
+ }
157
+ ```
158
+
159
+ > [查看完整示例](../assets/UnusedVariableWarning.ets)
160
+
161
+ ## 使用场景
162
+
163
+ ### 1. 事件回调中的未使用参数
164
+
165
+ ```typescript
166
+ // ✅ 使用下划线前缀
167
+ .onClick((_event: ClickEvent) => {
168
+ this.handleClick();
169
+ })
170
+
171
+ .onDidScroll((scrollOffset: number, _scrollState: ScrollState) => {
172
+ this.scrollOffset = scrollOffset;
173
+ })
174
+ ```
175
+
176
+ ### 2. ForEach 中的未使用参数
177
+
178
+ ```typescript
179
+ // ✅ 使用下划线前缀
180
+ ForEach(this.items, (_item: Item, index: number) => {
181
+ Text(`Item ${index}`)
182
+ }, (item: Item, index: number) => `${index}`)
183
+ ```
184
+
185
+ ### 3. 函数参数中的未使用参数
186
+
187
+ ```typescript
188
+ // ✅ 使用下划线前缀
189
+ private processData(data: string, _options: ProcessOptions) {
190
+ return data.toUpperCase();
191
+ }
192
+ ```
193
+
194
+ ### 4. 解构赋值中的未使用属性
195
+
196
+ ```typescript
197
+ // ✅ 使用下划线前缀
198
+ const { name, _id, _timestamp } = this.userData;
199
+ console.log(name);
200
+ ```
201
+
202
+ ## 最佳实践
203
+
204
+ ### 1. 使用下划线前缀明确意图
205
+
206
+ ```typescript
207
+ // 明确表示该参数是故意未使用的
208
+ function example(required: string, _optional: string) {
209
+ console.log(required);
210
+ }
211
+ ```
212
+
213
+ ### 2. 保持 API 一致性
214
+
215
+ ```typescript
216
+ // 即使某些参数未使用,也保留它们以保持 API 一致性
217
+ .onDidScroll((scrollOffset: number, _scrollState: ScrollState) => {
218
+ this.scrollOffset = scrollOffset;
219
+ })
220
+ ```
221
+
222
+ ### 3. 考虑是否真的不需要
223
+
224
+ ```typescript
225
+ // 在添加下划线前缀前,考虑是否真的不需要该参数
226
+ .onDidScroll((scrollOffset: number, scrollState: ScrollState) => {
227
+ this.scrollOffset = scrollOffset;
228
+ // 也许未来会需要 scrollState?
229
+ this.scrollState = scrollState;
230
+ })
231
+ ```
232
+
233
+ ### 4. 删除真正未使用的变量
234
+
235
+ ```typescript
236
+ // 如果变量确实不需要,直接删除
237
+ // ❌ 不好:保留未使用的变量
238
+ const unused = calculateSomething();
239
+ doSomething();
240
+
241
+ // ✅ 好:删除未使用的变量
242
+ doSomething();
243
+ ```
244
+
245
+ ## 注意事项
246
+
247
+ 1. **下划线前缀约定**:使用 `_` 作为前缀是 TypeScript 社区的常见约定
248
+
249
+ 2. **明确意图**:下划线前缀明确表示该变量是故意未使用的
250
+
251
+ 3. **保持一致性**:在项目中统一使用下划线前缀标记未使用变量
252
+
253
+ 4. **定期清理**:定期检查并删除真正未使用的变量和参数
254
+
255
+ 5. **代码审查**:在代码审查时关注未使用变量警告
256
+
257
+ ## 相关 API 参考
258
+
259
+ - [TypeScript 未使用变量警告](https://www.typescriptlang.org/docs/handbook/compiler-options.html#noUnusedLocals)
260
+ - [ArkTS 编译选项](https://developer.harmonyos.com/cn/docs/documentation/guides/arkts-getting-started)
261
+
262
+ ## 迁移检查清单
263
+
264
+ - [ ] 识别所有未使用变量警告
265
+ - [ ] 为确实不需要使用的参数添加下划线前缀
266
+ - [ ] 考虑是否应该使用某些被标记为未使用的参数
267
+ - [ ] 删除真正未使用的变量
268
+ - [ ] 测试功能是否正常
269
+ - [ ] 确认警告已消失
270
+
271
+ ## 常见问题
272
+
273
+ ### Q: 为什么要使用下划线前缀而不是删除参数?
274
+
275
+ A: 有时需要保留参数以保持 API 一致性(如事件回调),下划线前缀明确表示这是故意的。
276
+
277
+ ### Q: 下划线前缀会影响运行时行为吗?
278
+
279
+ A: 不会。下划线前缀只是一个命名约定,不会影响代码的执行。
280
+
281
+ ### Q: 可以在所有未使用变量上使用下划线前缀吗?
282
+
283
+ A: 可以,但对于真正未使用的变量,建议删除而不是添加下划线前缀。
284
+
285
+ ### Q: 如何区分故意未使用和遗漏使用?
286
+
287
+ A: 如果参数是 API 的一部分(如事件回调),使用下划线前缀;如果是临时变量,考虑删除。
288
+
289
+ ### Q: 编译器会自动处理未使用变量吗?
290
+
291
+ A: 某些编译器选项会自动删除未使用的变量,但建议手动处理以保持代码清晰。
292
+
293
+ ### Q: ForEach 中的未使用参数如何处理?
294
+
295
+ A: 使用下划线前缀标记未使用的参数,如 `(_item: Item, index: number)`。
@@ -0,0 +1,290 @@
1
+ # Utility Type Errors
2
+
3
+ ## Error: Utility types not supported
4
+
5
+ ### Error Message
6
+ ```
7
+ Some of utility types are not supported (arkts-no-utility-types)
8
+ ```
9
+
10
+ ### Cause
11
+ ArkTS does not support TypeScript's utility types like `Parameters<T>`, `ReturnType<T>`, `Partial<T>`, etc. These utility types are part of TypeScript's advanced type system but are not compatible with ArkTS's stricter type system.
12
+
13
+ ### Solution
14
+ Use explicit type definitions, interfaces, or type aliases instead of utility types. For function parameters, use `Object[]` or define explicit parameter types.
15
+
16
+ ### Key Points
17
+ - ArkTS does not support TypeScript utility types
18
+ - Use explicit type definitions instead
19
+ - Use interfaces or type aliases for complex types
20
+ - Use `Object[]` for rest parameters
21
+ - Define function types explicitly
22
+
23
+ ### ❌ Wrong Usage
24
+ ```typescript
25
+ // ❌ Wrong: Using Parameters<T>
26
+ function debounce<T extends (...args: any[]) => void>(func: T, delay: number): T {
27
+ return ((...args: Parameters<T>) => {
28
+ setTimeout(() => func(...args), delay);
29
+ }) as T;
30
+ }
31
+
32
+ // ❌ Wrong: Using ReturnType<T>
33
+ type Handler = () => string;
34
+ type Result = ReturnType<Handler>;
35
+
36
+ // ❌ Wrong: Using Partial<T>
37
+ interface Config {
38
+ width: number;
39
+ height: number;
40
+ color?: string;
41
+ }
42
+ const partial: Partial<Config> = { width: 100 };
43
+ ```
44
+
45
+ ### ✅ Correct Usage
46
+ ```typescript
47
+ // ✅ Correct: Using Object[] for rest parameters
48
+ function debounce(func: Function, delay: number): Function {
49
+ return (...args: Object[]): void => {
50
+ setTimeout(() => func(...args), delay);
51
+ };
52
+ }
53
+
54
+ // ✅ Correct: Using explicit type
55
+ type Handler = () => string;
56
+ type Result = string;
57
+
58
+ // ✅ Correct: Using optional properties
59
+ interface Config {
60
+ width: number;
61
+ height: number;
62
+ color?: string;
63
+ }
64
+ const partial: Config = { width: 100, height: 0, color: undefined };
65
+ ```
66
+
67
+ ### Function Type Definitions
68
+
69
+ #### Using Explicit Types
70
+ ```typescript
71
+ // ✅ Correct: Explicit function type
72
+ private handleClick = (event: ClickEvent): void => {
73
+ this.count++;
74
+ };
75
+
76
+ // ✅ Correct: Explicit return type
77
+ private getValue(): string {
78
+ return 'Hello';
79
+ }
80
+ ```
81
+
82
+ #### Using Interfaces
83
+ ```typescript
84
+ // ✅ Correct: Interface for function type
85
+ interface EventHandler {
86
+ (event: ClickEvent): void;
87
+ }
88
+
89
+ private handleClick: EventHandler = (event: ClickEvent): void => {
90
+ console.info('Clicked');
91
+ };
92
+ ```
93
+
94
+ #### Using Type Aliases
95
+ ```typescript
96
+ // ✅ Correct: Type alias for function type
97
+ type ClickHandler = (event: ClickEvent) => void;
98
+
99
+ private handleClick: ClickHandler = (event: ClickEvent): void => {
100
+ console.info('Clicked');
101
+ };
102
+ ```
103
+
104
+ ### Rest Parameters
105
+
106
+ #### ❌ Wrong
107
+ ```typescript
108
+ // ❌ Wrong: Using Parameters<T>
109
+ function wrapper<T extends (...args: any[]) => void>(func: T): void {
110
+ return (...args: Parameters<T>) => {
111
+ func(...args);
112
+ };
113
+ }
114
+ ```
115
+
116
+ #### ✅ Correct
117
+ ```typescript
118
+ // ✅ Correct: Using Object[]
119
+ function wrapper(func: Function): Function {
120
+ return (...args: Object[]): void => {
121
+ func(...args);
122
+ };
123
+ }
124
+
125
+ // ✅ Correct: Using explicit types
126
+ function wrapper(func: (x: number, y: number) => void): (x: number, y: number) => void {
127
+ return (x: number, y: number): void => {
128
+ func(x, y);
129
+ };
130
+ }
131
+ ```
132
+
133
+ ### Debounce Implementation
134
+
135
+ #### ❌ Wrong
136
+ ```typescript
137
+ class DebounceUtil {
138
+ private timeoutId: number = -1;
139
+
140
+ debounce<T extends (...args: any[]) => void>(func: T, delay: number): T {
141
+ return ((...args: Parameters<T>) => {
142
+ clearTimeout(this.timeoutId);
143
+ this.timeoutId = setTimeout(() => {
144
+ func(...args);
145
+ }, delay);
146
+ }) as T;
147
+ }
148
+ }
149
+ ```
150
+
151
+ #### ✅ Correct
152
+ ```typescript
153
+ class DebounceUtil {
154
+ private timeoutId: number = -1;
155
+
156
+ debounce(func: Function, delay: number): Function {
157
+ return (...args: Object[]): void => {
158
+ clearTimeout(this.timeoutId);
159
+ this.timeoutId = setTimeout(() => {
160
+ func(...args);
161
+ }, delay);
162
+ };
163
+ }
164
+ }
165
+
166
+ // ✅ Correct: With explicit types
167
+ class DebounceUtil {
168
+ private timeoutId: number = -1;
169
+
170
+ debounce(func: (event: ClickEvent) => void, delay: number): (event: ClickEvent) => void {
171
+ return (event: ClickEvent): void => {
172
+ clearTimeout(this.timeoutId);
173
+ this.timeoutId = setTimeout(() => {
174
+ func(event);
175
+ }, delay);
176
+ };
177
+ }
178
+ }
179
+ ```
180
+
181
+ ### Generic Functions
182
+
183
+ #### ❌ Wrong
184
+ ```typescript
185
+ // ❌ Wrong: Using utility types
186
+ function wrap<T extends (...args: any[]) => R, R>(func: T): T {
187
+ return func;
188
+ }
189
+ ```
190
+
191
+ #### ✅ Correct
192
+ ```typescript
193
+ // ✅ Correct: Using explicit types
194
+ function wrap(func: (x: number, y: number) => number): (x: number, y: number) => number {
195
+ return func;
196
+ }
197
+
198
+ // ✅ Correct: Using interfaces
199
+ interface BinaryFunction {
200
+ (x: number, y: number): number;
201
+ }
202
+
203
+ function wrap(func: BinaryFunction): BinaryFunction {
204
+ return func;
205
+ }
206
+ ```
207
+
208
+ ### Common Patterns
209
+
210
+ #### Event Handlers
211
+ ```typescript
212
+ // ✅ Correct: Event handler type
213
+ type ClickHandler = (event: ClickEvent) => void;
214
+ type TouchHandler = (event: TouchEvent) => void;
215
+ type ScrollHandler = (event: ScrollEvent) => void;
216
+
217
+ @Component
218
+ struct EventHandlers {
219
+ private onClick: ClickHandler = (event: ClickEvent): void => {
220
+ console.info('Clicked');
221
+ };
222
+
223
+ private onTouch: TouchHandler = (event: TouchEvent): void => {
224
+ console.info('Touched');
225
+ };
226
+
227
+ build() {
228
+ Column() {
229
+ Button('Click')
230
+ .onClick(this.onClick)
231
+ }
232
+ .onTouch(this.onTouch)
233
+ }
234
+ }
235
+ ```
236
+
237
+ #### Callback Functions
238
+ ```typescript
239
+ // ✅ Correct: Callback type
240
+ interface SuccessCallback {
241
+ (data: string): void;
242
+ }
243
+
244
+ interface ErrorCallback {
245
+ (error: Error): void;
246
+ }
247
+
248
+ class DataFetcher {
249
+ fetchData(success: SuccessCallback, error: ErrorCallback): void {
250
+ try {
251
+ success('Data loaded');
252
+ } catch (e) {
253
+ error(e as Error);
254
+ }
255
+ }
256
+ }
257
+ ```
258
+
259
+ #### Utility Functions
260
+ ```typescript
261
+ // ✅ Correct: Utility function types
262
+ type Mapper<T, R> = (item: T, index: number) => R;
263
+ type Filter<T> = (item: T, index: number) => boolean;
264
+ type Reducer<T, R> = (acc: R, item: T, index: number) => R;
265
+
266
+ class ArrayUtils {
267
+ static map<T, R>(array: T[], mapper: Mapper<T, R>): R[] {
268
+ return array.map(mapper);
269
+ }
270
+
271
+ static filter<T>(array: T[], filter: Filter<T>): T[] {
272
+ return array.filter(filter);
273
+ }
274
+
275
+ static reduce<T, R>(array: T[], reducer: Reducer<T, R>, initial: R): R {
276
+ return array.reduce(reducer, initial);
277
+ }
278
+ }
279
+ ```
280
+
281
+ ### Best Practices
282
+ 1. **Use explicit types**: Always define function types explicitly
283
+ 2. **Use interfaces**: Define interfaces for complex function types
284
+ 3. **Use type aliases**: Create type aliases for reusable function types
285
+ 4. **Avoid utility types**: Don't use TypeScript utility types
286
+ 5. **Use Object[]**: Use `Object[]` for rest parameters
287
+
288
+ ### Related Files
289
+ - [Code Example](../assets/UtilityTypeError.ets)
290
+ - [ArkTS Type System](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-type-system)
@@ -0,0 +1,70 @@
1
+ # window.Rect 和 window.Size 类型错误
2
+
3
+ ## 常见错误
4
+
5
+ ### 1. window.Point 不存在
6
+
7
+ ```
8
+ Property 'Point' does not exist on type 'Namespace window'
9
+ ```
10
+
11
+ ### 2. window.Size 不存在
12
+
13
+ ```
14
+ Property 'size' does not exist on type 'WindowProperties'
15
+ ```
16
+
17
+ ### 3. window.Rect 属性访问错误
18
+
19
+ ```
20
+ Property 'x' does not exist on type 'Rect'
21
+ Property 'y' does not exist on type 'Rect'
22
+ ```
23
+
24
+ ## 错误原因
25
+
26
+ - `window.Rect` 使用 `left/top` 而非 `x/y`
27
+ - `WindowProperties` 没有 `size` 属性,需要从 `windowRect` 获取
28
+ - `window.Point` 类型不存在
29
+
30
+ ## 解决方案
31
+
32
+ ### window.Rect 正确使用
33
+
34
+ ```typescript
35
+ // window.Rect 有 left, top, width, height 属性
36
+ const rect: window.Rect = { left: 0, top: 0, width: 100, height: 100 };
37
+ ```
38
+
39
+ ### 从 WindowProperties 获取尺寸
40
+
41
+ ```typescript
42
+ const properties = win.getWindowProperties();
43
+ const rect = properties.windowRect;
44
+ const width = rect.width;
45
+ const height = rect.height;
46
+ ```
47
+
48
+ ### windowSizeChange 事件回调
49
+
50
+ ```typescript
51
+ win.on('windowSizeChange', (size: window.Size) => {
52
+ // size 有 width 和 height 属性
53
+ this.windowRect = {
54
+ left: this.windowRect.left,
55
+ top: this.windowRect.top,
56
+ width: size.width,
57
+ height: size.height
58
+ };
59
+ });
60
+ ```
61
+
62
+ ## 详细代码示例
63
+
64
+ 请参考 [WindowRectSizeError.ets](../assets/WindowRectSizeError.ets)
65
+
66
+ ## 相关 API
67
+
68
+ - [WindowProperties](https://developer.harmonyos.com/cn/docs/documentation/reference/apis-arkui-window-0000001774129417)
69
+ - [window.Rect](https://developer.harmonyos.com/cn/docs/documentation/reference/apis-arkui-window-0000001774129417)
70
+ - [window.Size](https://developer.harmonyos.com/cn/docs/documentation/reference/apis-arkui-window-0000001774129417)