@buaa_smat/hometrans 0.1.12 → 0.1.14

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 (86) hide show
  1. package/README.md +164 -114
  2. package/agents/build-fixer.md +384 -394
  3. package/agents/code-reviewer.md +240 -240
  4. package/agents/logic-coder.md +199 -199
  5. package/agents/logic-context-builder.md +194 -194
  6. package/agents/review-fixer.md +405 -405
  7. package/agents/self-test-fixer.md +296 -296
  8. package/agents/self-tester.md +393 -392
  9. package/agents/spec-generator.md +540 -540
  10. package/dist/cli/config-store.js +84 -8
  11. package/dist/cli/config.js +3 -3
  12. package/dist/cli/env-vars.js +129 -0
  13. package/dist/cli/init.js +272 -272
  14. package/dist/cli/uninstall.js +152 -17
  15. package/dist/context/index.js +10 -197
  16. package/env-requirements.json +3 -3
  17. package/package.json +1 -1
  18. package/resource/choose_editor.png +0 -0
  19. package/resource/common_config.png +0 -0
  20. package/resource/integration_test_config.png +0 -0
  21. package/resource/set_env.png +0 -0
  22. package/resource/ui_align_config.png +0 -0
  23. package/skills/hmos-batch-ui-align/SKILL.md +108 -98
  24. package/skills/hmos-batch-ui-align/references/conversion-procedure.md +180 -180
  25. package/skills/hmos-batch-ui-align/references/mappings/android-to-harmonyOS-ui-atomic-component-mapping-reference.md +2533 -2533
  26. package/skills/hmos-batch-ui-align/references/mappings/android-to-harmonyOS-ui-interaction-mapping-reference.md +555 -555
  27. package/skills/hmos-batch-ui-align/references/mappings/android-to-harmonyOS-ui-layout-mapping-reference.md +117 -117
  28. package/skills/hmos-batch-ui-align/references/mvvm/@Link/350/243/205/351/245/260/345/231/250/357/274/232/347/210/266/345/255/220/345/217/214/345/220/221/345/220/214/346/255/245.md +648 -648
  29. package/skills/hmos-batch-ui-align/references/mvvm/@Observed/350/243/205/351/245/260/345/231/250/345/222/214@ObjectLink/350/243/205/351/245/260/345/231/250/357/274/232/345/265/214/345/245/227/347/261/273/345/257/271/350/261/241/345/261/236/346/200/247/345/217/230/345/214/226.md +2088 -2088
  30. package/skills/hmos-batch-ui-align/references/mvvm/@Prop/350/243/205/351/245/260/345/231/250/357/274/232/347/210/266/345/255/220/345/215/225/345/220/221/345/220/214/346/255/245.md +1033 -1033
  31. package/skills/hmos-batch-ui-align/references/mvvm/@Provide/350/243/205/351/245/260/345/231/250/345/222/214@Consume/350/243/205/351/245/260/345/231/250/357/274/232/344/270/216/345/220/216/344/273/243/347/273/204/344/273/266/345/217/214/345/220/221/345/220/214/346/255/245.md +1183 -1183
  32. package/skills/hmos-batch-ui-align/references/mvvm/@State/350/243/205/351/245/260/345/231/250/357/274/232/347/273/204/344/273/266/345/206/205/347/212/266/346/200/201.md +576 -576
  33. package/skills/hmos-batch-ui-align/references/mvvm/@Track/350/243/205/351/245/260/345/231/250/357/274/232class/345/257/271/350/261/241/345/261/236/346/200/247/347/272/247/346/233/264/346/226/260.md +297 -297
  34. package/skills/hmos-batch-ui-align/references/mvvm/@Watch/350/243/205/351/245/260/345/231/250/357/274/232/347/212/266/346/200/201/345/217/230/351/207/217/346/233/264/346/224/271/351/200/232/347/237/245.md +395 -395
  35. package/skills/hmos-batch-ui-align/references/mvvm/AppStorage/357/274/232/345/272/224/347/224/250/345/205/250/345/261/200/347/232/204UI/347/212/266/346/200/201/345/255/230/345/202/250.md +902 -902
  36. package/skills/hmos-batch-ui-align/references/mvvm/Environment/357/274/232/350/256/276/345/244/207/347/216/257/345/242/203/346/237/245/350/257/242.md +106 -106
  37. package/skills/hmos-batch-ui-align/references/mvvm/LocalStorage/357/274/232/351/241/265/351/235/242/347/272/247UI/347/212/266/346/200/201/345/255/230/345/202/250.md +1178 -1178
  38. package/skills/hmos-batch-ui-align/references/mvvm/MVVM/346/250/241/345/274/217/357/274/210V1/357/274/211.md +911 -911
  39. package/skills/hmos-batch-ui-align/references/mvvm/PersistentStorage/357/274/232/346/214/201/344/271/205/345/214/226/345/255/230/345/202/250UI/347/212/266/346/200/201.md +354 -354
  40. package/skills/hmos-batch-ui-align/references/mvvm//347/256/241/347/220/206/345/272/224/347/224/250/346/213/245/346/234/211/347/232/204/347/212/266/346/200/201/346/246/202/350/277/260.md +11 -11
  41. package/skills/hmos-convert-pipeline/SKILL.md +429 -415
  42. package/skills/hmos-fix-build-errors/SKILL.md +272 -273
  43. package/skills/hmos-fix-build-errors/references/arkts-strict-patterns.md +219 -219
  44. package/skills/hmos-fix-build-errors/references/known-patterns.md +157 -157
  45. package/skills/hmos-fix-build-errors/references/rdb-entity-pattern.md +131 -131
  46. package/skills/hmos-incremental-ui-align/SKILL.md +219 -200
  47. package/skills/hmos-incremental-ui-align/diff_analysis.md +52 -52
  48. package/skills/hmos-incremental-ui-align/page_align.md +62 -62
  49. package/skills/hmos-incremental-ui-align/readme.md +237 -230
  50. package/skills/hmos-incremental-ui-align/references/Comparison_Template.md +2 -2
  51. package/skills/hmos-incremental-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@Link/350/243/205/351/245/260/345/231/250/357/274/232/347/210/266/345/255/220/345/217/214/345/220/221/345/220/214/346/255/245.md +648 -648
  52. package/skills/hmos-incremental-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@Observed/350/243/205/351/245/260/345/231/250/345/222/214@ObjectLink/350/243/205/351/245/260/345/231/250/357/274/232/345/265/214/345/245/227/347/261/273/345/257/271/350/261/241/345/261/236/346/200/247/345/217/230/345/214/226.md +2088 -2088
  53. package/skills/hmos-incremental-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@Prop/350/243/205/351/245/260/345/231/250/357/274/232/347/210/266/345/255/220/345/215/225/345/220/221/345/220/214/346/255/245.md +1033 -1033
  54. package/skills/hmos-incremental-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@Provide/350/243/205/351/245/260/345/231/250/345/222/214@Consume/350/243/205/351/245/260/345/231/250/357/274/232/344/270/216/345/220/216/344/273/243/347/273/204/344/273/266/345/217/214/345/220/221/345/220/214/346/255/245.md +1183 -1183
  55. package/skills/hmos-incremental-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@State/350/243/205/351/245/260/345/231/250/357/274/232/347/273/204/344/273/266/345/206/205/347/212/266/346/200/201.md +576 -576
  56. package/skills/hmos-incremental-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@Track/350/243/205/351/245/260/345/231/250/357/274/232class/345/257/271/350/261/241/345/261/236/346/200/247/347/272/247/346/233/264/346/226/260.md +297 -297
  57. package/skills/hmos-incremental-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@Watch/350/243/205/351/245/260/345/231/250/357/274/232/347/212/266/346/200/201/345/217/230/351/207/217/346/233/264/346/224/271/351/200/232/347/237/245.md +395 -395
  58. package/skills/hmos-incremental-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/AppStorage/357/274/232/345/272/224/347/224/250/345/205/250/345/261/200/347/232/204UI/347/212/266/346/200/201/345/255/230/345/202/250.md +902 -902
  59. package/skills/hmos-incremental-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/Environment/357/274/232/350/256/276/345/244/207/347/216/257/345/242/203/346/237/245/350/257/242.md +106 -106
  60. package/skills/hmos-incremental-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/LocalStorage/357/274/232/351/241/265/351/235/242/347/272/247UI/347/212/266/346/200/201/345/255/230/345/202/250.md +1178 -1178
  61. package/skills/hmos-incremental-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/MVVM/346/250/241/345/274/217V1.md +911 -911
  62. package/skills/hmos-incremental-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/PersistentStorage/357/274/232/346/214/201/344/271/205/345/214/226/345/255/230/345/202/250UI/347/212/266/346/200/201.md +354 -354
  63. package/skills/hmos-incremental-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243//347/256/241/347/220/206/345/272/224/347/224/250/346/213/245/346/234/211/347/232/204/347/212/266/346/200/201/346/246/202/350/277/260.md +11 -11
  64. package/skills/hmos-incremental-ui-align/references/UI_Analysis_Template.md +3 -3
  65. package/skills/hmos-incremental-ui-align/references/android-to-harmonyOS-ui-atomic-component-mapping-reference.md +2533 -2533
  66. package/skills/hmos-incremental-ui-align/references/android-to-harmonyOS-ui-interaction-mapping-reference.md +555 -555
  67. package/skills/hmos-incremental-ui-align/references/android-to-harmonyOS-ui-layout-mapping-reference.md +117 -117
  68. package/skills/hmos-incremental-ui-align/scripts/navigation-capure.md +37 -37
  69. package/skills/hmos-integration-test/SKILL.md +380 -369
  70. package/skills/hmos-integration-test/readme.md +309 -309
  71. package/skills/hmos-resources-convert/SKILL.md +623 -623
  72. package/skills/hmos-resources-convert/references/conversion-rules.md +663 -663
  73. package/skills/hmos-resources-convert/references/dependency-analysis-rules.md +388 -388
  74. package/skills/hmos-resources-convert/references/resource-mapping-rules.md +457 -457
  75. package/skills/hmos-resources-convert/references/xml-drawable-to-svg-rules.md +513 -513
  76. package/skills/hmos-spec-generate/SKILL.md +331 -331
  77. package/skills/hmos-spec-generate/references/android-platform-tokens.md +105 -105
  78. package/skills/hmos-spec-generate/references/spec-sample-1.md +78 -78
  79. package/skills/hmos-spec-generate/references/spec-sample-2.md +58 -58
  80. package/skills/hmos-spec-generate/references/spec-sample-3.md +116 -116
  81. package/skills/hmos-spec-generate/references/step4-report-template.md +33 -33
  82. package/tools/test-tools/autotest/README.md +33 -17
  83. package/tools/test-tools/autotest/self_test_runner.py +109 -15
  84. package/resource/hometrans_config.png +0 -0
  85. package/skills/hmos-incremental-ui-align/config-example.json +0 -11
  86. package/tools/test-tools/autotest/config.yaml.example +0 -58
@@ -1,157 +1,157 @@
1
- # Known Compile Error Patterns
2
-
3
- > **This file is auto-maintained by `a2h-retrospect`.**
4
- > Manual edits are allowed but may be overwritten when retrospect detects updated patterns.
5
- > Last updated: 2026-03-27
6
-
7
- ---
8
-
9
- ## Pattern Index
10
-
11
- | # | Error Code / Type | Frequency | Short Description |
12
- |---|-------------------|-----------|-------------------|
13
- | 1 | arkts-identifiers-as-prop-names | 85 | ValuesBucket computed property name |
14
- | 2 | type mismatch (EventData) | 16 | EventData double type cast |
15
- | 3 | arkts-no-untyped-obj-literals | 9 | Untyped object literal |
16
- | 4 | type mismatch (promptAction) | 8 | promptAction button color type |
17
- | 5 | type error (@Prop) | 3 | @Prop naming conflict |
18
-
19
- ---
20
-
21
- ## 1. ValuesBucket Computed Property Name
22
-
23
- - **Date**: 2026-03-27
24
- - **Error code**: `arkts-identifiers-as-prop-names`
25
- - **Frequency**: 85 occurrences
26
- - **Source**: AntennaPod V1 migration (a2h-retrospect-report-2026-03-27)
27
-
28
- **Error code**:
29
- ```typescript
30
- const bucket: ValuesBucket = {
31
- [ColumnName.TITLE]: title, // ERROR: computed property name not allowed
32
- [ColumnName.URL]: url,
33
- };
34
- ```
35
-
36
- **Correct code**:
37
- ```typescript
38
- const bucket: ValuesBucket = {};
39
- bucket[ColumnName.TITLE] = title;
40
- bucket[ColumnName.URL] = url;
41
- ```
42
-
43
- **Rule**: ArkTS forbids computed property names (`[expr]: value`) in object literals. Build the object first, then assign properties via bracket notation.
44
-
45
- ---
46
-
47
- ## 2. EventData Double Type Cast
48
-
49
- - **Date**: 2026-03-27
50
- - **Error code**: type mismatch
51
- - **Frequency**: 16 occurrences
52
- - **Source**: AntennaPod V1 migration (a2h-retrospect-report-2026-03-27)
53
-
54
- **Error code**:
55
- ```typescript
56
- emitter.on({ eventId: 1 }, (data: emitter.EventData) => {
57
- const value = data.data?.['key'] as string; // ERROR: data.data is optional Record, direct cast fails
58
- });
59
- ```
60
-
61
- **Correct code**:
62
- ```typescript
63
- emitter.on({ eventId: 1 }, (data: emitter.EventData) => {
64
- const raw = data.data as Record<string, Object>;
65
- const value = raw['key'] as string;
66
- });
67
- ```
68
-
69
- **Rule**: `EventData.data` is typed `Record<string, Object> | undefined`. Access requires two steps: (1) cast to `Record<string, Object>`, (2) cast the extracted value to the target type.
70
-
71
- ---
72
-
73
- ## 3. Untyped Object Literal
74
-
75
- - **Date**: 2026-03-27
76
- - **Error code**: `arkts-no-untyped-obj-literals`
77
- - **Frequency**: 9 occurrences
78
- - **Source**: AntennaPod V1 migration (a2h-retrospect-report-2026-03-27)
79
-
80
- **Error code**:
81
- ```typescript
82
- const options = {
83
- title: 'Hello',
84
- message: 'World',
85
- }; // ERROR: object literal without explicit type annotation
86
- ```
87
-
88
- **Correct code**:
89
- ```typescript
90
- interface DialogOptions {
91
- title: string;
92
- message: string;
93
- }
94
- const options: DialogOptions = {
95
- title: 'Hello',
96
- message: 'World',
97
- };
98
- ```
99
-
100
- **Rule**: ArkTS requires all object literals to have an explicit type. Define an `interface` or `class` and annotate the variable.
101
-
102
- ---
103
-
104
- ## 4. promptAction Button Color Type
105
-
106
- - **Date**: 2026-03-27
107
- - **Error code**: type mismatch
108
- - **Frequency**: 8 occurrences
109
- - **Source**: AntennaPod V1 migration (a2h-retrospect-report-2026-03-27)
110
-
111
- **Error code**:
112
- ```typescript
113
- promptAction.showDialog({
114
- buttons: [
115
- { text: 'OK', color: '#ff0000' } // ERROR: color expects ResourceColor, not string
116
- ]
117
- });
118
- ```
119
-
120
- **Correct code**:
121
- ```typescript
122
- promptAction.showDialog({
123
- buttons: [
124
- { text: 'OK', color: Color.Red }
125
- ]
126
- });
127
- // Or use $r('app.color.xxx') for resource reference
128
- ```
129
-
130
- **Rule**: `promptAction.showDialog` button `color` property expects `ResourceColor` type (Color enum or `$r()` resource reference), not a raw hex string.
131
-
132
- ---
133
-
134
- ## 5. @Prop Naming Conflict
135
-
136
- - **Date**: 2026-03-27
137
- - **Error code**: type error
138
- - **Frequency**: 3 occurrences
139
- - **Source**: AntennaPod V1 migration (a2h-retrospect-report-2026-03-27)
140
-
141
- **Error code**:
142
- ```typescript
143
- @Component
144
- struct MyComponent {
145
- @Prop title: string = ''; // ERROR: 'title' conflicts with built-in component property
146
- }
147
- ```
148
-
149
- **Correct code**:
150
- ```typescript
151
- @Component
152
- struct MyComponent {
153
- @Prop itemTitle: string = ''; // Renamed to avoid conflict
154
- }
155
- ```
156
-
157
- **Rule**: Certain property names (`title`, `content`, `action`, etc.) conflict with built-in component attributes. Prefix with a domain-specific qualifier (e.g., `itemTitle`, `feedTitle`).
1
+ # Known Compile Error Patterns
2
+
3
+ > **This file is auto-maintained by `a2h-retrospect`.**
4
+ > Manual edits are allowed but may be overwritten when retrospect detects updated patterns.
5
+ > Last updated: 2026-03-27
6
+
7
+ ---
8
+
9
+ ## Pattern Index
10
+
11
+ | # | Error Code / Type | Frequency | Short Description |
12
+ |---|-------------------|-----------|-------------------|
13
+ | 1 | arkts-identifiers-as-prop-names | 85 | ValuesBucket computed property name |
14
+ | 2 | type mismatch (EventData) | 16 | EventData double type cast |
15
+ | 3 | arkts-no-untyped-obj-literals | 9 | Untyped object literal |
16
+ | 4 | type mismatch (promptAction) | 8 | promptAction button color type |
17
+ | 5 | type error (@Prop) | 3 | @Prop naming conflict |
18
+
19
+ ---
20
+
21
+ ## 1. ValuesBucket Computed Property Name
22
+
23
+ - **Date**: 2026-03-27
24
+ - **Error code**: `arkts-identifiers-as-prop-names`
25
+ - **Frequency**: 85 occurrences
26
+ - **Source**: AntennaPod V1 migration (a2h-retrospect-report-2026-03-27)
27
+
28
+ **Error code**:
29
+ ```typescript
30
+ const bucket: ValuesBucket = {
31
+ [ColumnName.TITLE]: title, // ERROR: computed property name not allowed
32
+ [ColumnName.URL]: url,
33
+ };
34
+ ```
35
+
36
+ **Correct code**:
37
+ ```typescript
38
+ const bucket: ValuesBucket = {};
39
+ bucket[ColumnName.TITLE] = title;
40
+ bucket[ColumnName.URL] = url;
41
+ ```
42
+
43
+ **Rule**: ArkTS forbids computed property names (`[expr]: value`) in object literals. Build the object first, then assign properties via bracket notation.
44
+
45
+ ---
46
+
47
+ ## 2. EventData Double Type Cast
48
+
49
+ - **Date**: 2026-03-27
50
+ - **Error code**: type mismatch
51
+ - **Frequency**: 16 occurrences
52
+ - **Source**: AntennaPod V1 migration (a2h-retrospect-report-2026-03-27)
53
+
54
+ **Error code**:
55
+ ```typescript
56
+ emitter.on({ eventId: 1 }, (data: emitter.EventData) => {
57
+ const value = data.data?.['key'] as string; // ERROR: data.data is optional Record, direct cast fails
58
+ });
59
+ ```
60
+
61
+ **Correct code**:
62
+ ```typescript
63
+ emitter.on({ eventId: 1 }, (data: emitter.EventData) => {
64
+ const raw = data.data as Record<string, Object>;
65
+ const value = raw['key'] as string;
66
+ });
67
+ ```
68
+
69
+ **Rule**: `EventData.data` is typed `Record<string, Object> | undefined`. Access requires two steps: (1) cast to `Record<string, Object>`, (2) cast the extracted value to the target type.
70
+
71
+ ---
72
+
73
+ ## 3. Untyped Object Literal
74
+
75
+ - **Date**: 2026-03-27
76
+ - **Error code**: `arkts-no-untyped-obj-literals`
77
+ - **Frequency**: 9 occurrences
78
+ - **Source**: AntennaPod V1 migration (a2h-retrospect-report-2026-03-27)
79
+
80
+ **Error code**:
81
+ ```typescript
82
+ const options = {
83
+ title: 'Hello',
84
+ message: 'World',
85
+ }; // ERROR: object literal without explicit type annotation
86
+ ```
87
+
88
+ **Correct code**:
89
+ ```typescript
90
+ interface DialogOptions {
91
+ title: string;
92
+ message: string;
93
+ }
94
+ const options: DialogOptions = {
95
+ title: 'Hello',
96
+ message: 'World',
97
+ };
98
+ ```
99
+
100
+ **Rule**: ArkTS requires all object literals to have an explicit type. Define an `interface` or `class` and annotate the variable.
101
+
102
+ ---
103
+
104
+ ## 4. promptAction Button Color Type
105
+
106
+ - **Date**: 2026-03-27
107
+ - **Error code**: type mismatch
108
+ - **Frequency**: 8 occurrences
109
+ - **Source**: AntennaPod V1 migration (a2h-retrospect-report-2026-03-27)
110
+
111
+ **Error code**:
112
+ ```typescript
113
+ promptAction.showDialog({
114
+ buttons: [
115
+ { text: 'OK', color: '#ff0000' } // ERROR: color expects ResourceColor, not string
116
+ ]
117
+ });
118
+ ```
119
+
120
+ **Correct code**:
121
+ ```typescript
122
+ promptAction.showDialog({
123
+ buttons: [
124
+ { text: 'OK', color: Color.Red }
125
+ ]
126
+ });
127
+ // Or use $r('app.color.xxx') for resource reference
128
+ ```
129
+
130
+ **Rule**: `promptAction.showDialog` button `color` property expects `ResourceColor` type (Color enum or `$r()` resource reference), not a raw hex string.
131
+
132
+ ---
133
+
134
+ ## 5. @Prop Naming Conflict
135
+
136
+ - **Date**: 2026-03-27
137
+ - **Error code**: type error
138
+ - **Frequency**: 3 occurrences
139
+ - **Source**: AntennaPod V1 migration (a2h-retrospect-report-2026-03-27)
140
+
141
+ **Error code**:
142
+ ```typescript
143
+ @Component
144
+ struct MyComponent {
145
+ @Prop title: string = ''; // ERROR: 'title' conflicts with built-in component property
146
+ }
147
+ ```
148
+
149
+ **Correct code**:
150
+ ```typescript
151
+ @Component
152
+ struct MyComponent {
153
+ @Prop itemTitle: string = ''; // Renamed to avoid conflict
154
+ }
155
+ ```
156
+
157
+ **Rule**: Certain property names (`title`, `content`, `action`, etc.) conflict with built-in component attributes. Prefix with a domain-specific qualifier (e.g., `itemTitle`, `feedTitle`).
@@ -1,131 +1,131 @@
1
- # RDB Entity 确定性修复 Pattern
2
- # 适用于: ArkTS 严格模式 + @kit.ArkData relationalStore
3
- # 触发场景: 迁移 Android RDB 实体类到 ArkTS 时
4
- # 经验来源: EinkBro 迁移 (2026-03-26)
5
-
6
- ---
7
-
8
- ## Pattern 1: ValuesBucket 正确用法
9
-
10
- ### 错误写法 (编译报错)
11
- ```typescript
12
- import { relationalStore, ValuesBucket } from '@kit.ArkData';
13
-
14
- toValuesBucket(): ValuesBucket {
15
- const bucket = new ValuesBucket(); // ERROR: 'ValuesBucket' only refers to a type
16
- bucket.put('key', value); // ERROR: ValuesBucket has no .put() method
17
- return bucket;
18
- }
19
- ```
20
-
21
- ### 正确写法
22
- ```typescript
23
- type EntityValuesBucket = Record<string, number | string | boolean | Uint8Array | null>;
24
-
25
- toValuesBucket(): EntityValuesBucket {
26
- const bucket: EntityValuesBucket = {};
27
- bucket['key'] = value;
28
- return bucket;
29
- }
30
- ```
31
-
32
- **原因**: `ValuesBucket` 在 SDK 中是 type alias (`Record<string, ValueType>`),不是可实例化的类。
33
-
34
- ---
35
-
36
- ## Pattern 2: fromResultSet 参数类型 (禁止 any)
37
-
38
- ### 错误写法 (编译报错)
39
- ```typescript
40
- // ArkTS 严格模式禁止 any
41
- static fromResultSet(resultSet: any): EntityName { // ERROR: arkts-no-any-unknown
42
- ```
43
-
44
- ### 正确写法
45
- ```typescript
46
- static fromResultSet(resultSet: Object): EntityName {
47
- const rs = resultSet as Record<string, Object>;
48
- const colIndex = (name: string): number =>
49
- (rs['getColumnIndex'] as Function)(name) as number;
50
-
51
- entity.field = (rs['getLong'] as Function)(colIndex('field_name')) as number;
52
- entity.name = (rs['getString'] as Function)(colIndex('name')) as string;
53
- return entity;
54
- }
55
- ```
56
-
57
- **替代方案** (更简洁但运行时开销略高):
58
- ```typescript
59
- // 使用类型断言避免 any,运行时通过 Record<string, Function> 调用
60
- static fromResultSet(resultSet: Object): EntityName {
61
- const getCol = (name: string): number =>
62
- (resultSet as Record<string, Function>)['getColumnIndex'](name) as number;
63
- const getLong = (name: string): number =>
64
- (resultSet as Record<string, Function>)['getLong'](getCol(name)) as number;
65
- const getStr = (name: string): string =>
66
- (resultSet as Record<string, Function>)['getString'](getCol(name)) as string;
67
-
68
- const entity = new EntityName();
69
- entity.id = getLong('id');
70
- entity.name = getStr('name');
71
- return entity;
72
- }
73
- ```
74
-
75
- ---
76
-
77
- ## Pattern 3: // @ts-ignore 不可用
78
-
79
- ### 错误尝试
80
- ```typescript
81
- // @ts-ignore // ERROR: Switching off type checks with in-place comments is not allowed
82
- static fromResultSet(resultSet: any): EntityName {
83
- ```
84
-
85
- ### 必须用 Pattern 2 替代
86
-
87
- ---
88
-
89
- ## Pattern 4: toValuesBucket() 返回类型注解
90
-
91
- ```typescript
92
- type EntityValuesBucket = Record<string, number | string | boolean | Uint8Array | null>;
93
-
94
- toValuesBucket(): EntityValuesBucket {
95
- const bucket: EntityValuesBucket = {} as EntityValuesBucket;
96
- // ...
97
- return bucket;
98
- }
99
- ```
100
-
101
- ---
102
-
103
- ## 完整 Entity 模板
104
-
105
- ```typescript
106
- type EntityValuesBucket = Record<string, number | string | boolean | Uint8Array | null>;
107
-
108
- export class MyEntity {
109
- id: number = 0;
110
- name: string = '';
111
- value: number = 0;
112
-
113
- static fromResultSet(resultSet: Object): MyEntity {
114
- const rs = resultSet as Record<string, Object>;
115
- const col = (n: string): number => (rs['getColumnIndex'] as Function)(n) as number;
116
- const entity = new MyEntity();
117
- entity.id = (rs['getLong'] as Function)(col('id')) as number;
118
- entity.name = (rs['getString'] as Function)(col('name')) as string;
119
- entity.value = (rs['getLong'] as Function)(col('value')) as number;
120
- return entity;
121
- }
122
-
123
- toValuesBucket(): EntityValuesBucket {
124
- const bucket: EntityValuesBucket = {} as EntityValuesBucket;
125
- if (this.id > 0) { bucket['id'] = this.id; }
126
- bucket['name'] = this.name;
127
- bucket['value'] = this.value;
128
- return bucket;
129
- }
130
- }
131
- ```
1
+ # RDB Entity 确定性修复 Pattern
2
+ # 适用于: ArkTS 严格模式 + @kit.ArkData relationalStore
3
+ # 触发场景: 迁移 Android RDB 实体类到 ArkTS 时
4
+ # 经验来源: EinkBro 迁移 (2026-03-26)
5
+
6
+ ---
7
+
8
+ ## Pattern 1: ValuesBucket 正确用法
9
+
10
+ ### 错误写法 (编译报错)
11
+ ```typescript
12
+ import { relationalStore, ValuesBucket } from '@kit.ArkData';
13
+
14
+ toValuesBucket(): ValuesBucket {
15
+ const bucket = new ValuesBucket(); // ERROR: 'ValuesBucket' only refers to a type
16
+ bucket.put('key', value); // ERROR: ValuesBucket has no .put() method
17
+ return bucket;
18
+ }
19
+ ```
20
+
21
+ ### 正确写法
22
+ ```typescript
23
+ type EntityValuesBucket = Record<string, number | string | boolean | Uint8Array | null>;
24
+
25
+ toValuesBucket(): EntityValuesBucket {
26
+ const bucket: EntityValuesBucket = {};
27
+ bucket['key'] = value;
28
+ return bucket;
29
+ }
30
+ ```
31
+
32
+ **原因**: `ValuesBucket` 在 SDK 中是 type alias (`Record<string, ValueType>`),不是可实例化的类。
33
+
34
+ ---
35
+
36
+ ## Pattern 2: fromResultSet 参数类型 (禁止 any)
37
+
38
+ ### 错误写法 (编译报错)
39
+ ```typescript
40
+ // ArkTS 严格模式禁止 any
41
+ static fromResultSet(resultSet: any): EntityName { // ERROR: arkts-no-any-unknown
42
+ ```
43
+
44
+ ### 正确写法
45
+ ```typescript
46
+ static fromResultSet(resultSet: Object): EntityName {
47
+ const rs = resultSet as Record<string, Object>;
48
+ const colIndex = (name: string): number =>
49
+ (rs['getColumnIndex'] as Function)(name) as number;
50
+
51
+ entity.field = (rs['getLong'] as Function)(colIndex('field_name')) as number;
52
+ entity.name = (rs['getString'] as Function)(colIndex('name')) as string;
53
+ return entity;
54
+ }
55
+ ```
56
+
57
+ **替代方案** (更简洁但运行时开销略高):
58
+ ```typescript
59
+ // 使用类型断言避免 any,运行时通过 Record<string, Function> 调用
60
+ static fromResultSet(resultSet: Object): EntityName {
61
+ const getCol = (name: string): number =>
62
+ (resultSet as Record<string, Function>)['getColumnIndex'](name) as number;
63
+ const getLong = (name: string): number =>
64
+ (resultSet as Record<string, Function>)['getLong'](getCol(name)) as number;
65
+ const getStr = (name: string): string =>
66
+ (resultSet as Record<string, Function>)['getString'](getCol(name)) as string;
67
+
68
+ const entity = new EntityName();
69
+ entity.id = getLong('id');
70
+ entity.name = getStr('name');
71
+ return entity;
72
+ }
73
+ ```
74
+
75
+ ---
76
+
77
+ ## Pattern 3: // @ts-ignore 不可用
78
+
79
+ ### 错误尝试
80
+ ```typescript
81
+ // @ts-ignore // ERROR: Switching off type checks with in-place comments is not allowed
82
+ static fromResultSet(resultSet: any): EntityName {
83
+ ```
84
+
85
+ ### 必须用 Pattern 2 替代
86
+
87
+ ---
88
+
89
+ ## Pattern 4: toValuesBucket() 返回类型注解
90
+
91
+ ```typescript
92
+ type EntityValuesBucket = Record<string, number | string | boolean | Uint8Array | null>;
93
+
94
+ toValuesBucket(): EntityValuesBucket {
95
+ const bucket: EntityValuesBucket = {} as EntityValuesBucket;
96
+ // ...
97
+ return bucket;
98
+ }
99
+ ```
100
+
101
+ ---
102
+
103
+ ## 完整 Entity 模板
104
+
105
+ ```typescript
106
+ type EntityValuesBucket = Record<string, number | string | boolean | Uint8Array | null>;
107
+
108
+ export class MyEntity {
109
+ id: number = 0;
110
+ name: string = '';
111
+ value: number = 0;
112
+
113
+ static fromResultSet(resultSet: Object): MyEntity {
114
+ const rs = resultSet as Record<string, Object>;
115
+ const col = (n: string): number => (rs['getColumnIndex'] as Function)(n) as number;
116
+ const entity = new MyEntity();
117
+ entity.id = (rs['getLong'] as Function)(col('id')) as number;
118
+ entity.name = (rs['getString'] as Function)(col('name')) as string;
119
+ entity.value = (rs['getLong'] as Function)(col('value')) as number;
120
+ return entity;
121
+ }
122
+
123
+ toValuesBucket(): EntityValuesBucket {
124
+ const bucket: EntityValuesBucket = {} as EntityValuesBucket;
125
+ if (this.id > 0) { bucket['id'] = this.id; }
126
+ bucket['name'] = this.name;
127
+ bucket['value'] = this.value;
128
+ return bucket;
129
+ }
130
+ }
131
+ ```