annil 1.7.5 → 1.7.6

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 (38) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +7 -6
  3. package/dist/api/DefineComponent/normalizeOptions/computedWatchHandle/getPropertiesValue.js +1 -0
  4. package/dist/api/DefineComponent/normalizeOptions/computedWatchHandle/getPropertiesValue.js.map +1 -1
  5. package/dist/api/DefineComponent/normalizeOptions/internalFieldProtection.js +1 -0
  6. package/dist/api/DefineComponent/normalizeOptions/internalFieldProtection.js.map +1 -1
  7. package/dist/api/RootComponent/PageLifetimes/PageLifetimesOption.d.ts +3 -1
  8. package/dist/api/RootComponent/Properties/GetPropertiesDoc.d.ts +2 -1
  9. package/dist/api/RootComponent/Properties/GetRequiredDoc.d.ts +2 -2
  10. package/dist/api/RootComponent/index.d.ts +2 -1
  11. package/dist/api/RootComponent/index.js.map +1 -1
  12. package/dist/api/SubComponent/SubComputed/SubComputedOption.d.ts +2 -2
  13. package/dist/api/SubComponent/index.d.ts +5 -2
  14. package/dist/api/SubComponent/index.js.map +1 -1
  15. package/dist/behaviors/BStore.js +2 -0
  16. package/dist/behaviors/BStore.js.map +1 -1
  17. package/dist/types/RemoveNullOfRequired.d.ts +7 -0
  18. package/dist/types/RemoveNullOfRequired.js +2 -0
  19. package/dist/types/RemoveNullOfRequired.js.map +1 -0
  20. package/dist/utils/assertNonNullable.js +1 -0
  21. package/dist/utils/assertNonNullable.js.map +1 -1
  22. package/package.json +1 -1
  23. package/src/api/DefineComponent/normalizeOptions/computedWatchHandle/getPropertiesValue.ts +1 -0
  24. package/src/api/DefineComponent/normalizeOptions/internalFieldProtection.ts +1 -0
  25. package/src/api/RootComponent/Computed/test/normal.test.ts +20 -0
  26. package/src/api/RootComponent/Instance/test/properties/mormal.test.ts +2 -4
  27. package/src/api/RootComponent/PageLifetimes/PageLifetimesOption.ts +4 -1
  28. package/src/api/RootComponent/PageLifetimes/test/normal.test.ts +26 -0
  29. package/src/api/RootComponent/Properties/GetOptionalDoc.ts +4 -4
  30. package/src/api/RootComponent/Properties/GetPropertiesDoc.ts +2 -1
  31. package/src/api/RootComponent/Properties/GetRequiredDoc.ts +9 -23
  32. package/src/api/RootComponent/index.ts +7 -1
  33. package/src/api/SubComponent/SubComputed/SubComputedOption.ts +2 -0
  34. package/src/api/SubComponent/SubComputed/test/normal.test.ts +1 -1
  35. package/src/api/SubComponent/SubInherit/test/normal.test.ts +14 -0
  36. package/src/api/SubComponent/index.ts +8 -2
  37. package/src/behaviors/BStore.ts +2 -0
  38. package/src/utils/assertNonNullable.ts +1 -0
package/CHANGELOG.md CHANGED
@@ -4,6 +4,13 @@
4
4
 
5
5
  * 解决DetailedType不接收接口类型的错误 ([ae8acbf](https://github.com/missannil/annil/commit/ae8acbfc2e62f99db565c448ad9253aa549e78bb))
6
6
 
7
+ ## [1.7.6](https://github.com/missannil/annil/compare/v1.7.5...v1.7.6) (2024-08-10)
8
+
9
+
10
+ ### Bug Fixes
11
+
12
+ * 1.7.6 ([e0e83c7](https://github.com/missannil/annil/commit/e0e83c7f44512abe9475d93b051a4e3364513b79))
13
+
7
14
  ## [1.7.5](https://github.com/missannil/annil/compare/v1.7.5-beta.4...v1.7.5) (2024-08-08)
8
15
 
9
16
 
package/README.md CHANGED
@@ -23,7 +23,7 @@
23
23
 
24
24
  ### 简介
25
25
 
26
- annil(安奈儿)是微信小程序原生开发插件。她会让你获得新的开发体验,提高代码质量和开发效率。
26
+ annil(安奈儿)是微信小程序原生开发插件。她会给您更佳的开发体验,大大提高代码质量和开发效率。
27
27
 
28
28
  ### 特点
29
29
 
@@ -37,7 +37,7 @@ annil(安奈儿)是微信小程序原生开发插件。她会让你获得新的
37
37
 
38
38
  - **组件类型概念**
39
39
 
40
- 新的组件构建API(DefineComponent)返回的类型叫组件类型,好比传统组件(UI)库为每个组件书写的使用文档,在做为子组件构建新组件(页面)时,子组件API(SubComponent)需要使用者传入组件类型,这样在书写配置字段时会得到完美的类型提示和检测。这样实现了一个页面中所有子组件之间的类型耦合,无论组件嵌套多少层,无论哪层组件数据类型发生改变,所有相关组件类型都会得到感知。当您增改、重构代码时,只要无类型报错(tsc --noEmit --watch)就不会有运行时报错的心智负担。
40
+ 新的组件构建API(DefineComponent)返回的类型叫组件类型,好比传统组件(UI)库为每个组件书写的使用文档,在做为子组件构建新组件(页面)时,子组件API(SubComponent)需要使用者传入组件类型,这样在书写配置字段时会得到完美的类型提示和错误检测。这样实现了在一个页面中所有子组件之间的类型耦合,无论组件嵌套多少层,无论哪层组件数据类型发生改变,所有相关组件类型都会得到感知。当您增改、重构代码时,只要无类型报错(tsc --noEmit --watch)就不会有运行时报错的心智负担。
41
41
 
42
42
  - **高兼容性**
43
43
 
@@ -53,7 +53,7 @@ annil(安奈儿)是微信小程序原生开发插件。她会让你获得新的
53
53
 
54
54
  - **vscode插件 `annil`**
55
55
 
56
- 当使用ts开发时,可安装vscode插件,会自动检测组件中`.wxml` 和 `.json`错误,并可一键修复。详情见 [插件市场](https://marketplace.visualstudio.com/items?itemName=missannil.vscode-annil)
56
+ 当使用ts开发时,可安装vscode插件,会自动检测组件中`.wxml` 和 `.json`错误,并可一键修复,不必在书写wxml中自定义组件的属性和json文件的导入地址了。详情见 [插件市场](https://marketplace.visualstudio.com/items?itemName=missannil.vscode-annil)
57
57
 
58
58
  ### 安装
59
59
 
@@ -68,12 +68,12 @@ annil(安奈儿)是微信小程序原生开发插件。她会让你获得新的
68
68
  - 可选
69
69
 
70
70
  ```bash
71
- # 使用ts开发 hry-types为annil依赖的类型库
71
+ # 使用ts开发 hry-types为annil依赖的类型库。
72
72
  npm --save-dev typescript hry-types miniprogram-api-typings
73
73
  ```
74
74
 
75
75
  ```bash
76
- # 使用全局状态管理 当前为mobx6版本
76
+ # 使用状态管理
77
77
  npm i mobx
78
78
  ```
79
79
 
@@ -98,7 +98,7 @@ annil(安奈儿)是微信小程序原生开发插件。她会让你获得新的
98
98
  ```
99
99
 
100
100
  开发者工具左上部工具栏——工具——构建npm
101
- 3. 配置tsconfig.json(使用ts开发时)
101
+ 3. tsconfig.json推荐配置(使用ts开发时)
102
102
 
103
103
  ```json
104
104
  {
@@ -108,6 +108,7 @@ annil(安奈儿)是微信小程序原生开发插件。她会让你获得新的
108
108
  "skipLibCheck": true, // 跳过声明文件的类型检查(.d.ts)。
109
109
  "esModuleInterop": true, // 默认false. 兼容非ES模块引用的写法(如 import type mobx from 'mobx'等).
110
110
  "strict": true, // 启用严格模式
111
+ "exactOptionalPropertyTypes": true, // 带有?标志的属性类型不在包含undefined类型
111
112
  "noEmit": true, // 编译时不生成文件。
112
113
  "strictFunctionTypes": false, // 忽略函数参数逆变引起的问题
113
114
  "types": [
@@ -11,6 +11,7 @@ function getRequiredSingleValue(PropType) {
11
11
  case Boolean:
12
12
  return false;
13
13
  default:
14
+ /* istanbul ignore next */
14
15
  throw Error("properties字段类型只能为 String | Number | Array | Object | Boolean ");
15
16
  }
16
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getPropertiesValue.js","sourceRoot":"","sources":["../../../../../src/api/DefineComponent/normalizeOptions/computedWatchHandle/getPropertiesValue.ts"],"names":[],"mappings":"AASA,SAAS,sBAAsB,CAC7B,QAAwB;IAExB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,EAAE,CAAC;QACZ,KAAK,MAAM;YACT,OAAO,CAAC,CAAC;QACX,KAAK,KAAK;YACR,OAAO,EAAE,CAAC;QACZ,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QACd,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;QACf;YACE,MAAM,KAAK,CACT,+DAA+D,CAChE,CAAC;IACN,CAAC;AACH,CAAC;AACD,SAAS,gBAAgB,CAAC,MAAuB;IAC/C,OAAO,MAAM,YAAY,QAAQ,CAAC;AACpC,CAAC;AACD,SAAS,eAAe,CAAC,MAAuB;IAC9C,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AACD,MAAM,UAAU,kBAAkB,CAAC,aAA+C;IAChF,IAAI,aAAa,KAAK,SAAS;QAAE,OAAO;IACxC,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,kBAAkB;YAClB,MAAM,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;aAAM,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,kBAAkB;YAClB,MAAM,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,kBAAkB;YAClB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"getPropertiesValue.js","sourceRoot":"","sources":["../../../../../src/api/DefineComponent/normalizeOptions/computedWatchHandle/getPropertiesValue.ts"],"names":[],"mappings":"AASA,SAAS,sBAAsB,CAC7B,QAAwB;IAExB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,EAAE,CAAC;QACZ,KAAK,MAAM;YACT,OAAO,CAAC,CAAC;QACX,KAAK,KAAK;YACR,OAAO,EAAE,CAAC;QACZ,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QACd,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;QACf;YACE,0BAA0B;YAC1B,MAAM,KAAK,CACT,+DAA+D,CAChE,CAAC;IACN,CAAC;AACH,CAAC;AACD,SAAS,gBAAgB,CAAC,MAAuB;IAC/C,OAAO,MAAM,YAAY,QAAQ,CAAC;AACpC,CAAC;AACD,SAAS,eAAe,CAAC,MAAuB;IAC9C,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AACD,MAAM,UAAU,kBAAkB,CAAC,aAA+C;IAChF,IAAI,aAAa,KAAK,SAAS;QAAE,OAAO;IACxC,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,kBAAkB;YAClB,MAAM,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;aAAM,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,kBAAkB;YAClB,MAAM,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,kBAAkB;YAClB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -16,6 +16,7 @@ export function InternalFieldProtection(finalOptionsForComponent) {
16
16
  }
17
17
  for (const key of dataFieldKeys) {
18
18
  if (internalFiled.data.includes(key)) {
19
+ /* istanbul ignore next 同上*/
19
20
  throw Error(`data配置中的${key}字段已被内部字段占用`);
20
21
  }
21
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"internalFieldProtection.js","sourceRoot":"","sources":["../../../../src/api/DefineComponent/normalizeOptions/internalFieldProtection.ts"],"names":[],"mappings":"AAEA,OAAO;AACP,MAAM,aAAa,GAAG;IACpB,OAAO,EAAE,CAAC,UAAU,EAAE,qBAAqB,CAAC;IAC5C,IAAI,EAAE,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,mBAAmB,CAAC;CACpE,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,wBAAiD;IACvF,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACvE,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAEjE,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,IAAI,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,MAAM,KAAK,CAAC,cAAc,GAAG,YAAY,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,KAAK,CAAC,WAAW,GAAG,YAAY,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"internalFieldProtection.js","sourceRoot":"","sources":["../../../../src/api/DefineComponent/normalizeOptions/internalFieldProtection.ts"],"names":[],"mappings":"AAEA,OAAO;AACP,MAAM,aAAa,GAAG;IACpB,OAAO,EAAE,CAAC,UAAU,EAAE,qBAAqB,CAAC;IAC5C,IAAI,EAAE,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,mBAAmB,CAAC;CACpE,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,wBAAiD;IACvF,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACvE,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAEjE,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,IAAI,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,MAAM,KAAK,CAAC,cAAc,GAAG,YAAY,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,4BAA4B;YAC5B,MAAM,KAAK,CAAC,WAAW,GAAG,YAAY,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,6 +1,8 @@
1
1
  import type { IfExtends } from "hry-types/src/Any/IfExtends";
2
2
  import type { ComputeIntersection } from "hry-types/src/Object/ComputeIntersection";
3
+ import type { ComputeObject } from "../../../types/ComputeObj";
3
4
  import type { WMCompPageLifetimes, WMPageLifetimes } from "../../../types/OfficialTypeAlias";
5
+ import type { RemoveNullOfRequired } from "../../../types/RemoveNullOfRequired";
4
6
  export type PageLifetimesOption<TIsPage extends boolean, PropertiesDoc extends object> = IfExtends<TIsPage, false, {
5
7
  pageLifetimes?: ComputeIntersection<Partial<WMCompPageLifetimes> & {
6
8
  /**
@@ -18,6 +20,6 @@ export type PageLifetimesOption<TIsPage extends boolean, PropertiesDoc extends o
18
20
  *
19
21
  * 页面加载时触发。一个页面只会调用一次,可以在 onLoad 的参数中获取Properties定义的数据。
20
22
  */
21
- onLoad?: (props: PropertiesDoc) => void | Promise<void>;
23
+ onLoad?: (props: ComputeObject<RemoveNullOfRequired<PropertiesDoc>>) => void | Promise<void>;
22
24
  }>;
23
25
  }>;
@@ -3,9 +3,10 @@ import type { ComputeIntersection } from "hry-types/src/Object/_api";
3
3
  import type { GetOptionalDoc } from "./GetOptionalDoc";
4
4
  import type { GetRequiredDoc } from "./GetRequiredDoc";
5
5
  import type { OptionalType, PropertiesConstraint } from "./PropertiesConstraint";
6
- type _GetPropertiesDoc<TProperties extends PropertiesConstraint, TIsPage extends boolean, OptionalDoc extends object = GetOptionalDoc<Select<TProperties, OptionalType>, TIsPage>, RequiredDoc extends object = GetRequiredDoc<Omit<TProperties, keyof OptionalDoc>, TIsPage>> = ComputeIntersection<OptionalDoc & RequiredDoc>;
6
+ type _GetPropertiesDoc<TProperties extends PropertiesConstraint, TIsPage extends boolean, OptionalDoc extends object = GetOptionalDoc<Select<TProperties, OptionalType>, TIsPage>, RequiredDoc extends object = GetRequiredDoc<Omit<TProperties, keyof OptionalDoc>>> = ComputeIntersection<OptionalDoc & RequiredDoc>;
7
7
  /**
8
8
  * properties字段的文档类型
9
+ * @remarks 必传的字段如果是object,要联合上null类型,选传的object根据是否是页面来决定是否加null
9
10
  */
10
11
  export type GetPropertiesDoc<TProperties extends PropertiesConstraint, TisPage extends boolean> = _GetPropertiesDoc<TProperties, TisPage>;
11
12
  export {};
@@ -6,6 +6,6 @@ import type { RequiredSingle, RequiredType } from "./PropertiesConstraint";
6
6
  * 获取properties必传字段的文档类型
7
7
  * @remarks 小程序中必传字段如果是object,默认类型为null,所以组件文档对象类型要联合上null类型
8
8
  */
9
- export type GetRequiredDoc<TProperties extends Record<string, RequiredType>, TIsPage extends boolean> = {
10
- -readonly [k in keyof TProperties]: IfExtends<TProperties[k], RequiredSingle, IfExtends<false, TIsPage, AddNullForObject<InferDetailedType<TProperties[k]>>, InferDetailedType<TProperties[k]>>, IfExtends<false, TIsPage, AddNullForObject<InferDetailedType<TProperties[k]["type"]> | InferDetailedType<TProperties[k]["optionalTypes"][number]>>, InferDetailedType<TProperties[k]["type"]> | InferDetailedType<TProperties[k]["optionalTypes"][number]>>>;
9
+ export type GetRequiredDoc<TProperties extends Record<string, RequiredType>> = {
10
+ -readonly [k in keyof TProperties]: IfExtends<TProperties[k], RequiredSingle, AddNullForObject<InferDetailedType<TProperties[k]>>, AddNullForObject<InferDetailedType<TProperties[k]["type"]> | InferDetailedType<TProperties[k]["optionalTypes"][number]>>>;
11
11
  };
@@ -4,6 +4,7 @@ import type { Func } from "hry-types/src/Misc/Func";
4
4
  import type { ComputeIntersection } from "hry-types/src/Object/_api";
5
5
  import type { ComputeObject } from "../../types/ComputeObj";
6
6
  import type { WMCompOtherOption } from "../../types/OfficialTypeAlias";
7
+ import type { RemoveNullOfRequired } from "../../types/RemoveNullOfRequired";
7
8
  import type { ComponentType } from "../DefineComponent/ReturnType/ComponentType";
8
9
  import type { IInjectAllData, IInjectStore } from "../InstanceInject/instanceConfig";
9
10
  import type { ComputedConstraint } from "./Computed/ComputedConstraint";
@@ -37,7 +38,7 @@ type RootComponentOptions<TEvents extends object, TIsPage extends boolean, TCust
37
38
  type RootComponentConstructor<TComponentDocList extends ComponentType[]> = <TEvents extends EventsConstraint<TComponentDocList>, TIsPage extends boolean = false, const TProperties extends PropertiesConstraint = {}, TData extends object = {}, TStore extends StoreConstraint = {}, TComputed extends ComputedConstraint = {}, TCustomEvents extends IfExtends<TIsPage, false, CustomEventConstraint, EmptyObject> = {}, TMethods extends MethodsConstraint = {}, EventsDoc extends object = IfExtends<EventsConstraint<TComponentDocList>, TEvents, {}, TEvents>, CustomEventsDoc extends object = GetCustomEventDoc<TCustomEvents>, PropertiesDoc extends object = GetPropertiesDoc<TProperties, TIsPage>, DataDoc extends object = TData, StoreDoc extends object = GetStoreDoc<TStore>, ComputedDoc extends object = GetComputedDoc<TComputed>>(options: RootComponentOptions<TEvents, TIsPage, TCustomEvents, TMethods, TProperties, TData, TStore, TComputed, EventsDoc, CustomEventsDoc, PropertiesDoc, DataDoc, StoreDoc, ComputedDoc>) => ComputeIntersection<IfExtends<TIsPage, false, {}, {
38
39
  isPage: true;
39
40
  }> & IfExtends<EmptyObject, PropertiesDoc, {}, {
40
- properties: PropertiesDoc;
41
+ properties: IfExtends<false, TIsPage, PropertiesDoc, RemoveNullOfRequired<PropertiesDoc>>;
41
42
  }> & IfExtends<EmptyObject, DataDoc, {}, {
42
43
  data: DataDoc;
43
44
  }> & IfExtends<EmptyObject, StoreDoc, {}, {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/RootComponent/index.ts"],"names":[],"mappings":"AAyIA,MAAM,UAAU,aAAa;IAM3B,8DAA8D;IAC9D,OAAO,CAAC,OAAY,EAAE,EAAE,CAAC,OAAO,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/RootComponent/index.ts"],"names":[],"mappings":"AA+IA,MAAM,UAAU,aAAa;IAM3B,8DAA8D;IAC9D,OAAO,CAAC,OAAY,EAAE,EAAE,CAAC,OAAO,CAAC;AACnC,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import type { G } from "hry-types";
2
- export type SubComputedOption<TComputed extends object, legal extends PropertyKey> = {
3
- computed?: TComputed & G.IllegalFieldValidator<TComputed, legal, 0, "", "重复或无效的字段">;
2
+ export type SubComputedOption<TComputed extends object, legal extends PropertyKey, Instance extends object> = {
3
+ computed?: TComputed & ThisType<Instance> & G.IllegalFieldValidator<TComputed, legal, 0, "", "重复或无效的字段">;
4
4
  };
@@ -2,13 +2,14 @@ import type { IfExtends } from "hry-types/src/Any/IfExtends";
2
2
  import type { EmptyObject } from "hry-types/src/Misc/EmptyObject";
3
3
  import type { Func } from "hry-types/src/Misc/Func";
4
4
  import type { RequiredKeys } from "hry-types/src/Object/RequiredKeys";
5
+ import type { ComputeObject } from "../../types/ComputeObj";
5
6
  import type { GetComponentPrefix } from "../../types/GetComponentPrefix";
6
7
  import type { InnerFields } from "../../types/InnerData";
7
8
  import type { WMCompOtherOption } from "../../types/OfficialTypeAlias";
8
9
  import type { Replace } from "../../types/Replace";
9
10
  import type { ReplacePrefix } from "../../types/ReplacePrefix";
10
11
  import type { ComponentType } from "../DefineComponent/ReturnType/ComponentType";
11
- import type { IInjectStore } from "../InstanceInject/instanceConfig";
12
+ import type { IInjectAllData, IInjectStore } from "../InstanceInject/instanceConfig";
12
13
  import type { ComputedConstraint } from "../RootComponent/Computed/ComputedConstraint";
13
14
  import type { DataConstraint } from "../RootComponent/Data/DataConstraint";
14
15
  import type { EventsConstraint } from "../RootComponent/Events/EventsConstraint";
@@ -36,7 +37,9 @@ import type { CreateSubComponentDoc } from "./SubReturnType/CreateSubComponentDo
36
37
  import type { SubStoreConstraint } from "./SubStore/SubStoreConstraint";
37
38
  import type { SubStoreOption } from "./SubStore/SubStoreOption";
38
39
  import type { SubWatchOption } from "./SubWatch/SubWatchOption";
39
- type Options<RootDoc extends RootComponentType, IsPage extends boolean, CurrentCompDoc extends ComponentType, Prefix extends string, AllRootDataDoc extends object, TInherit extends object, TSubData extends object, TSubStore extends object, TSubComputed extends object, TEvents extends object, TSubMethods extends SubMethodsConstraint, InheritDoc extends object, SubDataDoc extends object, SubStoreDoc extends object, SubComputedDoc extends object, SubEventsDoc extends object, SubMethodsDoc extends object, CompDocKeys extends PropertyKey = keyof CurrentCompDoc["properties"]> = SubInheritOption<TInherit, CompDocKeys> & SubDataOption<TSubData, Exclude<CompDocKeys, (keyof InheritDoc)> | InnerFields<Prefix>> & SubStoreOption<TSubStore, Exclude<CompDocKeys, (keyof (InheritDoc & SubDataDoc))> | InnerFields<Prefix>> & SubComputedOption<TSubComputed, Exclude<CompDocKeys, (keyof (InheritDoc & SubDataDoc & SubStoreDoc))> | InnerFields<Prefix>> & SubEventsOption<TEvents, SubEventsDoc, keyof SubEventsConstraint<CurrentCompDoc>> & SubMethodsOption<TSubMethods, Prefix, keyof (CurrentCompDoc["customEvents"] & SubEventsDoc)> & SubPageLifetimesOption<IsPage, NonNullable<RootDoc["properties"]>> & SubLifetimesOption & SubWatchOption<SubComputedDoc & SubDataDoc & AllRootDataDoc & SubStoreDoc & IInjectStore> & Partial<Omit<WMCompOtherOption, "pageLifetimes" | "definitionFilter" | "export" | "observers" | "relations">> & SubObserversOption<SubComputedDoc & SubDataDoc & AllRootDataDoc & SubStoreDoc & IInjectStore> & ThisType<SubInstance<SubMethodsDoc & RootDoc["methods"], Replace<SubDataDoc, Required<CurrentCompDoc["properties"]>>, AllRootDataDoc & Replace<SubDataDoc & SubComputedDoc & SubStoreDoc, Required<CurrentCompDoc["properties"]>>, NonNullable<RootDoc["customEvents"]>, SubStoreDoc>>;
40
+ type Options<RootDoc extends RootComponentType, IsPage extends boolean, CurrentCompDoc extends ComponentType, Prefix extends string, AllRootDataDoc extends object, TInherit extends object, TSubData extends object, TSubStore extends object, TSubComputed extends object, TEvents extends object, TSubMethods extends SubMethodsConstraint, InheritDoc extends object, SubDataDoc extends object, SubStoreDoc extends object, SubComputedDoc extends object, SubEventsDoc extends object, SubMethodsDoc extends object, CompDocKeys extends PropertyKey = keyof CurrentCompDoc["properties"]> = SubInheritOption<TInherit, CompDocKeys> & SubDataOption<TSubData, Exclude<CompDocKeys, (keyof InheritDoc)> | InnerFields<Prefix>> & SubStoreOption<TSubStore, Exclude<CompDocKeys, (keyof (InheritDoc & SubDataDoc))> | InnerFields<Prefix>> & SubComputedOption<TSubComputed, Exclude<CompDocKeys, (keyof (InheritDoc & SubDataDoc & SubStoreDoc))> | InnerFields<Prefix>, {
41
+ data: ComputeObject<AllRootDataDoc & Replace<SubComputedDoc, Required<CurrentCompDoc["properties"]>> & IInjectAllData>;
42
+ }> & SubEventsOption<TEvents, SubEventsDoc, keyof SubEventsConstraint<CurrentCompDoc>> & SubMethodsOption<TSubMethods, Prefix, keyof (CurrentCompDoc["customEvents"] & SubEventsDoc)> & SubPageLifetimesOption<IsPage, NonNullable<RootDoc["properties"]>> & SubLifetimesOption & SubWatchOption<SubComputedDoc & SubDataDoc & AllRootDataDoc & SubStoreDoc & IInjectStore> & Partial<Omit<WMCompOtherOption, "pageLifetimes" | "definitionFilter" | "export" | "observers" | "relations">> & SubObserversOption<SubComputedDoc & SubDataDoc & AllRootDataDoc & SubStoreDoc & IInjectStore> & ThisType<SubInstance<SubMethodsDoc & RootDoc["methods"], Replace<SubDataDoc, Required<CurrentCompDoc["properties"]>>, AllRootDataDoc & Replace<SubDataDoc & SubComputedDoc & SubStoreDoc, Required<CurrentCompDoc["properties"]>>, NonNullable<RootDoc["customEvents"]>, SubStoreDoc>>;
40
43
  type SubComponentConstructor<TRootDoc extends RootComponentType, TOriginalCompDoc extends ComponentType, TSupplementalPrefix extends string = "", IsPage extends boolean = TRootDoc["isPage"] extends true ? true : false, CurrentPrefix extends string = `${GetComponentPrefix<TOriginalCompDoc>}${Capitalize<TSupplementalPrefix>}`, CurrentCompDoc extends ComponentType = IfExtends<TSupplementalPrefix, "", TOriginalCompDoc, ReplacePrefix<TOriginalCompDoc, CurrentPrefix>>, AllRootDataDoc extends object = Required<TRootDoc["properties"]> & TRootDoc["data"] & TRootDoc["computed"] & TRootDoc["store"]> = <TInherit extends InheritConstraint<AllRootDataDoc, CurrentCompDoc>, TSubData extends SubDataConstraint<Omit<Required<CurrentCompDoc["properties"]>, keyof InheritDoc> & Record<InnerFields<CurrentPrefix>, unknown>>, TSubStore extends SubStoreConstraint<Omit<Required<CurrentCompDoc["properties"]>, keyof (InheritDoc & SubDataDoc)> & Record<InnerFields<CurrentPrefix>, unknown>>, TEvents extends SubEventsConstraint<CurrentCompDoc>, TSubComputed extends SubComputedConstraint<Omit<Required<CurrentCompDoc["properties"]>, keyof (InheritDoc & SubDataDoc & SubStoreDoc)> & Record<InnerFields<CurrentPrefix>, unknown>>, TSubMethods extends SubMethodsConstraint = {}, InheritDoc extends object = IfExtends<InheritConstraint<AllRootDataDoc, CurrentCompDoc>, TInherit, {}, TInherit>, SubDataDoc extends object = IfExtends<SubDataConstraint<Omit<Required<CurrentCompDoc["properties"]>, keyof InheritDoc> & Record<InnerFields<CurrentPrefix>, unknown>>, TSubData, {}, TSubData>, SubStoreDoc extends object = IfExtends<SubStoreConstraint<Omit<Required<CurrentCompDoc["properties"]>, keyof (InheritDoc & SubDataDoc)> & Record<InnerFields<CurrentPrefix>, unknown>>, TSubStore, {}, {
41
44
  [k in keyof TSubStore]: ReturnType<NonNullable<TSubStore[k]>>;
42
45
  }>, SubComputedDoc extends object = IfExtends<SubComputedConstraint<Omit<Required<CurrentCompDoc["properties"]>, keyof (InheritDoc & SubDataDoc & SubStoreDoc)> & Record<InnerFields<CurrentPrefix>, unknown>>, TSubComputed, {}, GetSubComputedDoc<TSubComputed>>, SubEventsDoc extends object = IfExtends<SubEventsConstraint<CurrentCompDoc>, TEvents, {}, TEvents>, SubMethodsDoc extends object = TSubMethods, MissingRequiredField extends PropertyKey = Exclude<RequiredKeys<NonNullable<CurrentCompDoc["properties"]>>, keyof (InheritDoc & SubDataDoc & SubStoreDoc & IfExtends<SubComputedConstraint<Omit<Required<CurrentCompDoc["properties"]>, keyof (InheritDoc & SubDataDoc & SubStoreDoc)>>, TSubComputed, {}, GetSubComputedDoc<TSubComputed>>)>>(options: Options<TRootDoc, IsPage, CurrentCompDoc, CurrentPrefix, AllRootDataDoc, TInherit, TSubData, TSubStore, TSubComputed, TEvents, TSubMethods, InheritDoc, SubDataDoc, SubStoreDoc, SubComputedDoc, SubEventsDoc, SubMethodsDoc>) => CreateSubComponentDoc<NonNullable<TOriginalCompDoc["customEvents"]>, SubEventsDoc, MissingRequiredField>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/SubComponent/index.ts"],"names":[],"mappings":"AAiOA;;;GAGG;AACH,MAAM,UAAU,YAAY;IAK1B,8DAA8D;IAC9D,OAAO,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,OAAkC,CAAQ,CAAC;AACvE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/SubComponent/index.ts"],"names":[],"mappings":"AAuOA;;;GAGG;AACH,MAAM,UAAU,YAAY;IAK1B,8DAA8D;IAC9D,OAAO,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,OAAkC,CAAQ,CAAC;AACvE,CAAC"}
@@ -8,6 +8,7 @@ function reactionRegister(storeConfig) {
8
8
  this.disposer = {};
9
9
  for (const key in storeConfig) {
10
10
  const currentStoreValue = toJS(storeConfig[key]());
11
+ /* istanbul ignore next 没办法测试啊,在打开一个页面后退回,修改store,再打开相同页面是会出现store数据不准确的问题*/
11
12
  // @ts-ignore this.data[key]一定存在
12
13
  if (!deepEqual(currentStoreValue, this.data[key])) {
13
14
  unequalData[key] = currentStoreValue;
@@ -22,6 +23,7 @@ function reactionRegister(storeConfig) {
22
23
  });
23
24
  }
24
25
  delete this.data.__storeConfig__;
26
+ /* istanbul ignore next */
25
27
  if (!isEmptyObject(unequalData))
26
28
  this.setData(unequalData);
27
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BStore.js","sourceRoot":"","sources":["../../src/behaviors/BStore.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,SAAS,gBAAgB,CAAiB,WAA0C;IAClF,MAAM,WAAW,GAA4B,EAAE,CAAC;IAChD,iEAAiE;IACjE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAgB,CAAC;IACpE,iCAAiC;IACjC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACnB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnD,gCAAgC;QAChC,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAClD,WAAW,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC;QACvC,CAAC;QACD,UAAU;QACV,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAC3B,WAAW,CAAC,GAAG,CAAC,EAChB,CAAC,KAAc,EAAE,EAAE;YACjB,IAAI,CAAC,OAAO,CAAC;gBACX,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;aACnB,CAAC,CAAC;QACL,CAAC,EACD;YACE,MAAM,EAAE,QAAQ,CAAC,UAAU;SAC5B,CACF,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;IACjC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;QAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,QAAQ,CAAC;IAC7B,SAAS,EAAE;QACT,QAAQ;YACN,iCAAiC;YACjC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;YAC9C,IAAI,CAAC,WAAW;gBAAE,OAAO;YAEzB,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC3C,CAAC;QACD,QAAQ;YACN,oJAAoJ;YACpJ,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;KACF;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"BStore.js","sourceRoot":"","sources":["../../src/behaviors/BStore.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,SAAS,gBAAgB,CAAiB,WAA0C;IAClF,MAAM,WAAW,GAA4B,EAAE,CAAC;IAChD,iEAAiE;IACjE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAgB,CAAC;IACpE,iCAAiC;IACjC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACnB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnD,4EAA4E;QAC5E,gCAAgC;QAChC,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAClD,WAAW,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC;QACvC,CAAC;QACD,UAAU;QACV,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAC3B,WAAW,CAAC,GAAG,CAAC,EAChB,CAAC,KAAc,EAAE,EAAE;YACjB,IAAI,CAAC,OAAO,CAAC;gBACX,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;aACnB,CAAC,CAAC;QACL,CAAC,EACD;YACE,MAAM,EAAE,QAAQ,CAAC,UAAU;SAC5B,CACF,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;IACjC,2BAA2B;IAC3B,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;QAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,QAAQ,CAAC;IAC7B,SAAS,EAAE;QACT,QAAQ;YACN,iCAAiC;YACjC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;YAC9C,IAAI,CAAC,WAAW;gBAAE,OAAO;YAEzB,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC3C,CAAC;QACD,QAAQ;YACN,oJAAoJ;YACpJ,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;KACF;CACF,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { RequiredKeys } from "hry-types/src/Object/RequiredKeys";
2
+ /**
3
+ * 去除对象中非可选字段类型中的null
4
+ */
5
+ export type RemoveNullOfRequired<T extends object, RequireKeys extends keyof T = RequiredKeys<T>> = {
6
+ [k in keyof T]: k extends RequireKeys ? Exclude<T[k], null> : T[k];
7
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=RemoveNullOfRequired.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoveNullOfRequired.js","sourceRoot":"","sources":["../../src/types/RemoveNullOfRequired.ts"],"names":[],"mappings":""}
@@ -1,4 +1,5 @@
1
1
  export function assertNonNullable(value) {
2
+ /* istanbul ignore next */
2
3
  if (value === null || value === undefined) {
3
4
  throw new Error(`${value} should not be null or undefined`);
4
5
  }
@@ -1 +1 @@
1
- {"version":3,"file":"assertNonNullable.js","sourceRoot":"","sources":["../../src/utils/assertNonNullable.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAC/B,KAAsE;IAEtE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,kCAAkC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,KAAuB,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"assertNonNullable.js","sourceRoot":"","sources":["../../src/utils/assertNonNullable.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAC/B,KAAsE;IAEtE,2BAA2B;IAC3B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,kCAAkC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,KAAuB,CAAC;AACjC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "annil",
3
- "version": "1.7.5",
3
+ "version": "1.7.6",
4
4
  "description": "微信小程序(原生开发)插件",
5
5
  "main": "dist/index.js",
6
6
  "types": "src/index.ts",
@@ -22,6 +22,7 @@ function getRequiredSingleValue(
22
22
  case Boolean:
23
23
  return false;
24
24
  default:
25
+ /* istanbul ignore next */
25
26
  throw Error(
26
27
  "properties字段类型只能为 String | Number | Array | Object | Boolean ",
27
28
  );
@@ -20,6 +20,7 @@ export function InternalFieldProtection(finalOptionsForComponent: FinalOptionsOf
20
20
  }
21
21
  for (const key of dataFieldKeys) {
22
22
  if (internalFiled.data.includes(key)) {
23
+ /* istanbul ignore next 同上*/
23
24
  throw Error(`data配置中的${key}字段已被内部字段占用`);
24
25
  }
25
26
  }
@@ -2,6 +2,8 @@
2
2
  /* eslint-disable @typescript-eslint/no-unused-vars */
3
3
  import { Checking, type Test } from "hry-types";
4
4
  import type { ComputeIntersection } from "hry-types/src/Object/_api";
5
+ import type { User } from "../../../../../jest/common";
6
+ import type { DetailedType } from "../../../../types/DetailedType";
5
7
  import type { IInjectAllData } from "../../../InstanceInject/instanceConfig";
6
8
  import { RootComponent } from "../..";
7
9
  import type { Mock_User } from "../../Properties/test/normalRequired.test";
@@ -94,3 +96,21 @@ const EmptyComputedFieldDoc = RootComponent()({
94
96
  });
95
97
 
96
98
  Checking<typeof EmptyComputedFieldDoc, { methods: { M1: () => void } }, Test.Pass>;
99
+ RootComponent()({
100
+ isPage: true,
101
+ properties: {
102
+ optionalObj: {
103
+ type: Object,
104
+ value: {},
105
+ },
106
+ requiredObj: Object as DetailedType<User>,
107
+ },
108
+
109
+ pageLifetimes: {
110
+ onLoad(prop) {
111
+ Checking<typeof prop.optionalObj, object | undefined, true>;
112
+ Checking<typeof prop.requiredObj, User, true>;
113
+ Checking<typeof this.data.optionalObj, object, true>;
114
+ },
115
+ },
116
+ });
@@ -49,11 +49,9 @@ RootComponent()({
49
49
  };
50
50
  obj: object;
51
51
  }, Test.Pass>;
52
-
53
- // 页面实例对象不额外添加null
52
+ // 页面可选对象不额外添加null
54
53
  Checking<typeof this.data.optionalObj, { name: string }, Test.Pass>;
55
-
56
- // 页面实例对象不额外添加null
54
+ // 页面必传对象没有null
57
55
  Checking<typeof this.data.obj, object, Test.Pass>;
58
56
  },
59
57
  },
@@ -1,6 +1,8 @@
1
1
  import type { IfExtends } from "hry-types/src/Any/IfExtends";
2
2
  import type { ComputeIntersection } from "hry-types/src/Object/ComputeIntersection";
3
+ import type { ComputeObject } from "../../../types/ComputeObj";
3
4
  import type { WMCompPageLifetimes, WMPageLifetimes } from "../../../types/OfficialTypeAlias";
5
+ import type { RemoveNullOfRequired } from "../../../types/RemoveNullOfRequired";
4
6
 
5
7
  export type PageLifetimesOption<TIsPage extends boolean, PropertiesDoc extends object> = IfExtends<
6
8
  TIsPage,
@@ -31,7 +33,8 @@ export type PageLifetimesOption<TIsPage extends boolean, PropertiesDoc extends o
31
33
  * 页面加载时触发。一个页面只会调用一次,可以在 onLoad 的参数中获取Properties定义的数据。
32
34
  */
33
35
  onLoad?: (
34
- props: PropertiesDoc,
36
+ // 默认PropertiesDoc
37
+ props: ComputeObject<RemoveNullOfRequired<PropertiesDoc>>,
35
38
  ) => void | Promise<void>;
36
39
  }
37
40
  >;
@@ -1,6 +1,7 @@
1
1
  import { Checking, type Test } from "hry-types";
2
2
  import { type DetailedType, RootComponent } from "../../../..";
3
3
 
4
+ import type { User } from "../../../../../jest/common";
4
5
  import type { Mock_User } from "../../Properties/test/normalRequired.test";
5
6
 
6
7
  /**
@@ -74,3 +75,28 @@ RootComponent()({
74
75
  // ...
75
76
  },
76
77
  });
78
+ // prop中必传对象没有null,但在实例中却需要有null
79
+ RootComponent()({
80
+ isPage: true,
81
+ properties: {
82
+ optionalObj: {
83
+ type: Object,
84
+ value: {},
85
+ },
86
+ requiredObj: Object as DetailedType<User>,
87
+ },
88
+
89
+ pageLifetimes: {
90
+ onLoad(prop) {
91
+ void prop;
92
+ // 页面外部传值时没必要传null,组件时有需要的。
93
+ void Checking<typeof prop.requiredObj, User, true>;
94
+ // 虽然传值不应该是null,但由于实例建立时默认为null,所以实例类型加上null
95
+ void Checking<typeof this.data.requiredObj, User, true>;
96
+ // 页面传入的可选对象不需要null,有undefined
97
+ void Checking<typeof prop.optionalObj, object | undefined, true>;
98
+ // 实例中的可选对象不需要null,有默认值。
99
+ void Checking<typeof this.data.optionalObj, object, true>;
100
+ },
101
+ },
102
+ });
@@ -16,20 +16,20 @@ export type GetOptionalDoc<
16
16
  IfExtends<
17
17
  false,
18
18
  TIsPage,
19
- // 组件时 对象加null
19
+ // 组件时 对象加null 只所以加是为了异步组件传值时,方便传初始值null,这导致实例中可选对象类型包含null
20
20
  AddNullForObject<InferDetailedType<TOptionalProperties[k]["type"]>>,
21
- // 页面时 对象不加
21
+ // 页面时 对象不加, 因为页面不存在异步传值。
22
22
  InferDetailedType<TOptionalProperties[k]["type"]>
23
23
  >,
24
24
  IfExtends<
25
25
  false,
26
26
  TIsPage,
27
- // 组件时 对象加null
27
+ // 组件时 对象加null 同上
28
28
  AddNullForObject<
29
29
  | InferDetailedType<TOptionalProperties[k]["type"]>
30
30
  | InferDetailedType<(TOptionalProperties[k]["optionalTypes"] & {})[number]>
31
31
  >,
32
- // 页面时 对象不加
32
+ // 页面时 对象不加 同上
33
33
  | InferDetailedType<TOptionalProperties[k]["type"]>
34
34
  | InferDetailedType<(TOptionalProperties[k]["optionalTypes"] & {})[number]>
35
35
  >
@@ -11,11 +11,12 @@ type _GetPropertiesDoc<
11
11
  // @ts-ignore
12
12
  OptionalDoc extends object = GetOptionalDoc<Select<TProperties, OptionalType>, TIsPage>,
13
13
  // @ts-ignore
14
- RequiredDoc extends object = GetRequiredDoc<Omit<TProperties, keyof OptionalDoc>, TIsPage>,
14
+ RequiredDoc extends object = GetRequiredDoc<Omit<TProperties, keyof OptionalDoc>>,
15
15
  > = ComputeIntersection<OptionalDoc & RequiredDoc>;
16
16
 
17
17
  /**
18
18
  * properties字段的文档类型
19
+ * @remarks 必传的字段如果是object,要联合上null类型,选传的object根据是否是页面来决定是否加null
19
20
  */
20
21
  export type GetPropertiesDoc<
21
22
  TProperties extends PropertiesConstraint,
@@ -9,34 +9,20 @@ import type { RequiredSingle, RequiredType } from "./PropertiesConstraint";
9
9
  */
10
10
  export type GetRequiredDoc<
11
11
  TProperties extends Record<string, RequiredType>,
12
- TIsPage extends boolean,
13
- > = {
12
+ > // TIsPage extends boolean,
13
+ = {
14
14
  -readonly [k in keyof TProperties]: IfExtends<
15
15
  TProperties[k],
16
16
  // 非对象写法
17
17
  RequiredSingle,
18
- IfExtends<
19
- false,
20
- TIsPage,
21
- // 组件的对象类型加null
22
- AddNullForObject<InferDetailedType<TProperties[k]>>,
23
- // 页面的对象类型不加null
24
- InferDetailedType<TProperties[k]>
25
- >,
26
- // 对象写法 RequiredUnion
27
- IfExtends<
28
- false,
29
- TIsPage,
30
- // 组件的对象类型加null
31
- AddNullForObject<
32
- // @ts-ignore TProperties[k] 必为 RequiredUnion
33
- | InferDetailedType<TProperties[k]["type"]>
34
- // @ts-ignore TProperties[k] 必为 RequiredUnion
35
- | InferDetailedType<TProperties[k]["optionalTypes"][number]>
36
- >,
37
- // 页面的对象类型不加null
18
+ // 组件的对象类型加null
19
+ AddNullForObject<InferDetailedType<TProperties[k]>>,
20
+ // 组件的对象类型加null
21
+ AddNullForObject<
38
22
  // @ts-ignore TProperties[k] 必为 RequiredUnion
39
- InferDetailedType<TProperties[k]["type"]> | InferDetailedType<TProperties[k]["optionalTypes"][number]>
23
+ | InferDetailedType<TProperties[k]["type"]>
24
+ // @ts-ignore TProperties[k] 必为 RequiredUnion
25
+ | InferDetailedType<TProperties[k]["optionalTypes"][number]>
40
26
  >
41
27
  >;
42
28
  };
@@ -4,6 +4,7 @@ import type { Func } from "hry-types/src/Misc/Func";
4
4
  import type { ComputeIntersection } from "hry-types/src/Object/_api";
5
5
  import type { ComputeObject } from "../../types/ComputeObj";
6
6
  import type { WMCompOtherOption } from "../../types/OfficialTypeAlias";
7
+ import type { RemoveNullOfRequired } from "../../types/RemoveNullOfRequired";
7
8
  import type { ComponentType } from "../DefineComponent/ReturnType/ComponentType";
8
9
  import type { IInjectAllData, IInjectStore } from "../InstanceInject/instanceConfig";
9
10
  import type { ComputedConstraint } from "./Computed/ComputedConstraint";
@@ -126,7 +127,12 @@ type RootComponentConstructor<TComponentDocList extends ComponentType[]> = <
126
127
  ) => // 返回类型 satisfies RootComponentDoc
127
128
  ComputeIntersection<
128
129
  & IfExtends<TIsPage, false, {}, { isPage: true }>
129
- & IfExtends<EmptyObject, PropertiesDoc, {}, { properties: PropertiesDoc }>
130
+ & IfExtends<
131
+ EmptyObject,
132
+ PropertiesDoc,
133
+ {},
134
+ { properties: IfExtends<false, TIsPage, PropertiesDoc, RemoveNullOfRequired<PropertiesDoc>> }
135
+ >
130
136
  & IfExtends<EmptyObject, DataDoc, {}, { data: DataDoc }>
131
137
  & IfExtends<EmptyObject, StoreDoc, {}, { store: ComputeObject<StoreDoc> }>
132
138
  & IfExtends<EmptyObject, ComputedDoc, {}, { computed: ComputedDoc }>
@@ -2,8 +2,10 @@ import type { G } from "hry-types";
2
2
  export type SubComputedOption<
3
3
  TComputed extends object,
4
4
  legal extends PropertyKey,
5
+ Instance extends object,
5
6
  > = {
6
7
  computed?:
7
8
  & TComputed
9
+ & ThisType<Instance>
8
10
  & G.IllegalFieldValidator<TComputed, legal, 0, "", "重复或无效的字段">;
9
11
  };
@@ -75,7 +75,7 @@ SubComponent<Root, OnlyPropsCompDoc>()({
75
75
  aaa_num123(): 123 {
76
76
  return 123;
77
77
  },
78
- aaa_str(): "a" {
78
+ aaa_str() {
79
79
  return "a";
80
80
  },
81
81
  aaa_obj() {
@@ -65,3 +65,17 @@ SubComponent<Mock_RootDoc, Mock_CompDoc>()({
65
65
  aaa_obj1: "" as "required_obj" | "optional_obj" | ["required_obj" | "optional_obj"] | "wxml",
66
66
  },
67
67
  });
68
+
69
+ // 4. 实例上没有computed字段。
70
+ SubComponent<{}, Mock_CompDoc>()({
71
+ computed: {
72
+ aaa_num() {
73
+ return 1;
74
+ },
75
+ },
76
+ methods: {
77
+ aaa_meA() {
78
+ console.log(this.data.aaa_num);
79
+ },
80
+ },
81
+ });
@@ -2,13 +2,14 @@ import type { IfExtends } from "hry-types/src/Any/IfExtends";
2
2
  import type { EmptyObject } from "hry-types/src/Misc/EmptyObject";
3
3
  import type { Func } from "hry-types/src/Misc/Func";
4
4
  import type { RequiredKeys } from "hry-types/src/Object/RequiredKeys";
5
+ import type { ComputeObject } from "../../types/ComputeObj";
5
6
  import type { GetComponentPrefix } from "../../types/GetComponentPrefix";
6
7
  import type { InnerFields } from "../../types/InnerData";
7
8
  import type { WMCompOtherOption } from "../../types/OfficialTypeAlias";
8
9
  import type { Replace } from "../../types/Replace";
9
10
  import type { ReplacePrefix } from "../../types/ReplacePrefix";
10
11
  import type { ComponentType } from "../DefineComponent/ReturnType/ComponentType";
11
- import type { IInjectStore } from "../InstanceInject/instanceConfig";
12
+ import type { IInjectAllData, IInjectStore } from "../InstanceInject/instanceConfig";
12
13
  import type { ComputedConstraint } from "../RootComponent/Computed/ComputedConstraint";
13
14
  import type { DataConstraint } from "../RootComponent/Data/DataConstraint";
14
15
  import type { EventsConstraint } from "../RootComponent/Events/EventsConstraint";
@@ -71,7 +72,12 @@ type Options<
71
72
  & SubComputedOption<
72
73
  TSubComputed,
73
74
  // 合法的配置
74
- Exclude<CompDocKeys, (keyof (InheritDoc & SubDataDoc & SubStoreDoc))> | InnerFields<Prefix>
75
+ Exclude<CompDocKeys, (keyof (InheritDoc & SubDataDoc & SubStoreDoc))> | InnerFields<Prefix>,
76
+ {
77
+ data: ComputeObject<
78
+ AllRootDataDoc & Replace<SubComputedDoc, Required<CurrentCompDoc["properties"]>> & IInjectAllData
79
+ >;
80
+ }
75
81
  >
76
82
  // 无需与根组件的events字段重复检测,因为根组件多了bubbles字段,一定不会重复
77
83
  & SubEventsOption<TEvents, SubEventsDoc, keyof SubEventsConstraint<CurrentCompDoc>>
@@ -11,6 +11,7 @@ function reactionRegister(this: Instance, storeConfig: Record<string, () => unkn
11
11
  this.disposer = {};
12
12
  for (const key in storeConfig) {
13
13
  const currentStoreValue = toJS(storeConfig[key]());
14
+ /* istanbul ignore next 没办法测试啊,在打开一个页面后退回,修改store,再打开相同页面是会出现store数据不准确的问题*/
14
15
  // @ts-ignore this.data[key]一定存在
15
16
  if (!deepEqual(currentStoreValue, this.data[key])) {
16
17
  unequalData[key] = currentStoreValue;
@@ -29,6 +30,7 @@ function reactionRegister(this: Instance, storeConfig: Record<string, () => unkn
29
30
  );
30
31
  }
31
32
  delete this.data.__storeConfig__;
33
+ /* istanbul ignore next */
32
34
  if (!isEmptyObject(unequalData)) this.setData(unequalData);
33
35
  }
34
36
 
@@ -3,6 +3,7 @@ import type { IfContains } from "hry-types/src/Any/IfContains";
3
3
  export function assertNonNullable<T>(
4
4
  value: IfContains<T, null | undefined, T, "参数类型必须包含 null 或 undefined">,
5
5
  ): NonNullable<T> {
6
+ /* istanbul ignore next */
6
7
  if (value === null || value === undefined) {
7
8
  throw new Error(`${value} should not be null or undefined`);
8
9
  }