annil 1.8.1 → 1.8.3

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 (44) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/api/DefineComponent/normalizeOptions/computedWatchHandle/index.js +2 -2
  3. package/dist/api/DefineComponent/normalizeOptions/computedWatchHandle/index.js.map +1 -1
  4. package/dist/api/SubComponent/SubComponentType.d.ts +1 -1
  5. package/dist/api/SubComponent/index.d.ts +7 -1
  6. package/dist/api/SubComponent/index.js.map +1 -1
  7. package/dist/types/Extra.d.ts +3 -0
  8. package/dist/types/Extra.js +2 -0
  9. package/dist/types/Extra.js.map +1 -0
  10. package/dist/utils/_utils.d.ts +2 -2
  11. package/dist/utils/_utils.js +2 -2
  12. package/dist/utils/_utils.js.map +1 -1
  13. package/dist/utils/debounce.d.ts +2 -1
  14. package/dist/utils/debounce.js +3 -2
  15. package/dist/utils/debounce.js.map +1 -1
  16. package/dist/utils/deepClone.d.ts +1 -1
  17. package/dist/utils/deepClone.js +2 -2
  18. package/dist/utils/deepClone.js.map +1 -1
  19. package/dist/utils/deepEqual.js +7 -8
  20. package/dist/utils/deepEqual.js.map +1 -1
  21. package/dist/utils/isEmptyObject.d.ts +3 -2
  22. package/dist/utils/isEmptyObject.js +6 -5
  23. package/dist/utils/isEmptyObject.js.map +1 -1
  24. package/dist/utils/nonNullable.d.ts +7 -0
  25. package/dist/utils/nonNullable.js +13 -0
  26. package/dist/utils/nonNullable.js.map +1 -0
  27. package/package.json +2 -2
  28. package/src/api/DefineComponent/normalizeOptions/computedWatchHandle/index.ts +2 -2
  29. package/src/api/RootComponent/Events/test/normal.test.ts +2 -2
  30. package/src/api/SubComponent/SubComponentType.ts +2 -1
  31. package/src/api/SubComponent/SubComputed/test/normal.test.ts +8 -0
  32. package/src/api/SubComponent/SubData/test/normal.test.ts +7 -1
  33. package/src/api/SubComponent/SubStore/test/normal.test.ts +6 -0
  34. package/src/api/SubComponent/index.ts +3 -2
  35. package/src/types/Extra.ts +1 -1
  36. package/src/utils/_utils.ts +2 -2
  37. package/src/utils/debounce.ts +3 -2
  38. package/src/utils/deepClone.ts +2 -2
  39. package/src/utils/deepEqual.ts +8 -9
  40. package/src/utils/isEmptyObject.ts +6 -5
  41. package/src/utils/{assertNonNullable.ts → nonNullable.ts} +6 -1
  42. package/dist/utils/assertNonNullable.d.ts +0 -2
  43. package/dist/utils/assertNonNullable.js +0 -8
  44. package/dist/utils/assertNonNullable.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,20 @@
4
4
 
5
5
  * 解决DetailedType不接收接口类型的错误 ([ae8acbf](https://github.com/missannil/annil/commit/ae8acbfc2e62f99db565c448ad9253aa549e78bb))
6
6
 
7
+ ## [1.8.3](https://github.com/missannil/annil/compare/v1.8.2...v1.8.3) (2024-09-08)
8
+
9
+
10
+ ### Bug Fixes
11
+
12
+ * 为subComponents内部组件类型增加 prefix_isReady?:boolean 字段。 ([e78041d](https://github.com/missannil/annil/commit/e78041d5f151d71c1d45652b0508aa4c2430ecde))
13
+
14
+ ## [1.8.2](https://github.com/missannil/annil/compare/v1.8.1...v1.8.2) (2024-09-07)
15
+
16
+
17
+ ### Bug Fixes
18
+
19
+ * 优化_SubComponentType类型,避免接口或类的类型由于无签名照成的报错 ([ab97097](https://github.com/missannil/annil/commit/ab970972717b08138c8438825a1e19f7e3dd7c38))
20
+
7
21
  ## [1.8.1](https://github.com/missannil/annil/compare/v1.8.0...v1.8.1) (2024-09-07)
8
22
 
9
23
 
@@ -3,9 +3,9 @@ import { computedUpdater } from "./computedUpdater";
3
3
  import { getPathsValue } from "./getPathsValue";
4
4
  import { getPropertiesValue } from "./getPropertiesValue";
5
5
  import { initComputedAndGetCache } from "./initComputedAndGetCache";
6
- import { assertNonNullable } from "../../../../utils/assertNonNullable";
7
6
  import { deepClone } from "../../../../utils/deepClone";
8
7
  import { isEmptyObject } from "../../../../utils/isEmptyObject";
8
+ import { nonNullable } from "../../../../utils/nonNullable";
9
9
  function initWatchOldValue(data, watchConfig) {
10
10
  const watchOldValue = {};
11
11
  for (const key in watchConfig) {
@@ -47,7 +47,7 @@ export function computedWatchHandle(options) {
47
47
  // 在监控多个数据时,参数是多个值
48
48
  observersConfig[key] = function (...newValue) {
49
49
  originObserversHandle === null || originObserversHandle === void 0 ? void 0 : originObserversHandle.call(this, ...newValue);
50
- const watchOldValue = assertNonNullable(this.data.__watchOldValue__);
50
+ const watchOldValue = nonNullable(this.data.__watchOldValue__);
51
51
  const oldValue = watchOldValue[key];
52
52
  if (deepEqual(newValue, oldValue))
53
53
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/api/DefineComponent/normalizeOptions/computedWatchHandle/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/api/DefineComponent/normalizeOptions/computedWatchHandle/index.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { SelectKeys } from "hry-types/src/Object/_api";
2
2
  import type { Composed, CustomEventsTags } from "../RootComponent/CustomEvents/CustomEventsTag";
3
3
  type _SubComponentType = {
4
- [k in string]: string | number | bigint | boolean | symbol | null | Record<string, unknown> | unknown[] | CustomEventsTags;
4
+ [k in string]: string | number | bigint | boolean | symbol | null | Record<string, any> | unknown[] | CustomEventsTags;
5
5
  };
6
6
  type _Validator<O, ErrKeys = Exclude<keyof O, SelectKeys<O, Composed, "contains->">>> = [ErrKeys] extends [never] ? _SubComponentType : `${ErrKeys & string} 不是穿透事件`;
7
7
  /**
@@ -3,6 +3,7 @@ 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
5
  import type { ComputeObject } from "../../types/ComputeObj";
6
+ import type { Extra } from "../../types/Extra";
6
7
  import type { GetComponentPrefix } from "../../types/GetComponentPrefix";
7
8
  import type { InnerFields } from "../../types/InnerData";
8
9
  import type { WMCompOtherOption } from "../../types/OfficialTypeAlias";
@@ -40,7 +41,12 @@ import type { SubWatchOption } from "./SubWatch/SubWatchOption";
40
41
  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
42
  data: ComputeObject<AllRootDataDoc & Replace<SubComputedDoc, Required<CurrentCompDoc["properties"]>> & SubStoreDoc & SubDataDoc & IInjectAllData>;
42
43
  }> & 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>>;
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, {}, {
44
+ 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 & {
45
+ properties: Extra<CurrentPrefix>;
46
+ }, // 为文档增加格外字段
47
+ ReplacePrefix<TOriginalCompDoc & {
48
+ properties: Extra<CurrentPrefix>;
49
+ }, 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, {}, {
44
50
  [k in keyof TSubStore]: ReturnType<NonNullable<TSubStore[k]>>;
45
51
  }>, 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<CurrentCompDoc["customEvents"]>, SubEventsDoc, MissingRequiredField>;
46
52
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/SubComponent/index.ts"],"names":[],"mappings":"AA2OA;;;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":"AA4OA;;;GAGG;AACH,MAAM,UAAU,YAAY;IAK1B,8DAA8D;IAC9D,OAAO,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,OAAkC,CAAQ,CAAC;AACvE,CAAC"}
@@ -0,0 +1,3 @@
1
+ export type Extra<Prefix extends string> = {
2
+ [K in `${Prefix}_isReady`]?: boolean;
3
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Extra.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Extra.js","sourceRoot":"","sources":["../../src/types/Extra.ts"],"names":[],"mappings":""}
@@ -1,7 +1,7 @@
1
- import { assertNonNullable } from "./assertNonNullable";
2
1
  import { debounce } from "./debounce";
3
2
  import { deepClone } from "./deepClone";
4
3
  import { deepEqual } from "./deepEqual";
5
4
  import { isEmptyObject } from "./isEmptyObject";
5
+ import { nonNullable } from "./nonNullable";
6
6
  import { throttle } from "./throttle";
7
- export { assertNonNullable, debounce, deepClone, deepEqual, isEmptyObject, throttle };
7
+ export { debounce, deepClone, deepEqual, isEmptyObject, nonNullable, throttle };
@@ -1,8 +1,8 @@
1
- import { assertNonNullable } from "./assertNonNullable";
2
1
  import { debounce } from "./debounce";
3
2
  import { deepClone } from "./deepClone";
4
3
  import { deepEqual } from "./deepEqual";
5
4
  import { isEmptyObject } from "./isEmptyObject";
5
+ import { nonNullable } from "./nonNullable";
6
6
  import { throttle } from "./throttle";
7
- export { assertNonNullable, debounce, deepClone, deepEqual, isEmptyObject, throttle };
7
+ export { debounce, deepClone, deepEqual, isEmptyObject, nonNullable, throttle };
8
8
  //# sourceMappingURL=_utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_utils.js","sourceRoot":"","sources":["../../src/utils/_utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"_utils.js","sourceRoot":"","sources":["../../src/utils/_utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * 防抖函数
3
- * 应用在输入框输入时,只有在输入完成并delay后,才会触发搜索
3
+ * 注意 需要在tsconfig.json的types中添加"node",否则NodeJS.Timeout会报错
4
+ * 例如 应用在输入框输入时,只有在输入完成并delay后,才会触发搜索,
4
5
  * @param func
5
6
  * @param delay
6
7
  * @returns
@@ -1,11 +1,12 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
1
  /**
3
2
  * 防抖函数
4
- * 应用在输入框输入时,只有在输入完成并delay后,才会触发搜索
3
+ * 注意 需要在tsconfig.json的types中添加"node",否则NodeJS.Timeout会报错
4
+ * 例如 应用在输入框输入时,只有在输入完成并delay后,才会触发搜索,
5
5
  * @param func
6
6
  * @param delay
7
7
  * @returns
8
8
  */
9
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
10
  export function debounce(func, delay) {
10
11
  let timeoutId = null;
11
12
  return (...args) => {
@@ -1 +1 @@
1
- {"version":3,"file":"debounce.js","sourceRoot":"","sources":["../../src/utils/debounce.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAoC,IAAO,EAAE,KAAa;IAChF,IAAI,SAAS,GAA0B,IAAI,CAAC;IAE5C,OAAO,CAAC,GAAG,IAAmB,EAAQ,EAAE;QACtC,IAAI,SAAS,EAAE,CAAC;YACd,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;QAED,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"debounce.js","sourceRoot":"","sources":["../../src/utils/debounce.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,8DAA8D;AAC9D,MAAM,UAAU,QAAQ,CAAoC,IAAO,EAAE,KAAa;IAChF,IAAI,SAAS,GAA0B,IAAI,CAAC;IAE5C,OAAO,CAAC,GAAG,IAAmB,EAAQ,EAAE;QACtC,IAAI,SAAS,EAAE,CAAC;YACd,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;QAED,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC,CAAC;AACJ,CAAC"}
@@ -1,4 +1,4 @@
1
1
  /**
2
- * 深度克隆 函数相同 原型一致
2
+ * 数组和普通对象的深度克隆,原型相同
3
3
  */
4
4
  export declare function deepClone<T>(value: T): T;
@@ -1,8 +1,8 @@
1
1
  /**
2
- * 深度克隆 函数相同 原型一致
2
+ * 数组和普通对象的深度克隆,原型相同
3
3
  */
4
4
  export function deepClone(value) {
5
- if (typeof value !== "object" || value === null || value instanceof RegExp) {
5
+ if (typeof value !== "object" || value === null) {
6
6
  return value;
7
7
  }
8
8
  const clone = (Array.isArray(value) ? [] : {});
@@ -1 +1 @@
1
- {"version":3,"file":"deepClone.js","sourceRoot":"","sources":["../../src/utils/deepClone.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,SAAS,CAAI,KAAQ;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,YAAY,MAAM,EAAE,CAAC;QAC3E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAM,CAAC;IAEpD,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IAE3D,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YACrD,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"deepClone.js","sourceRoot":"","sources":["../../src/utils/deepClone.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,SAAS,CAAI,KAAQ;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAM,CAAC;IAEpD,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IAE3D,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YACrD,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -3,7 +3,7 @@ function isNonNullObject(value) {
3
3
  return value !== null && typeof value === "object";
4
4
  }
5
5
  export function deepEqual(value1, value2) {
6
- // 2个非对象类型相等或同引用对象的情况。
6
+ // 两个非对象类型相等或同引用对象的情况。
7
7
  if (Object.is(value1, value2)) {
8
8
  return true;
9
9
  }
@@ -11,16 +11,15 @@ export function deepEqual(value1, value2) {
11
11
  if (!isNonNullObject(value1) || !isNonNullObject(value2)) {
12
12
  return false;
13
13
  }
14
- // 到此,2个都是对象类型。
15
- const _value1 = value1;
16
- const _value2 = value2;
17
- const value1Keys = Object.keys(_value1);
18
- const value2Keys = Object.keys(_value2);
19
- if (value1Keys.length !== value2Keys.length) {
14
+ // 到此两个值都是对象类型。
15
+ const value1Keys = Object.keys(value1);
16
+ // 使用Set提高查找效率。
17
+ const value2KeysSet = new Set(Object.keys(value2));
18
+ if (value1Keys.length !== value2KeysSet.size) {
20
19
  return false;
21
20
  }
22
21
  for (const key of value1Keys) {
23
- if (!value2Keys.includes(key) || !deepEqual(_value1[key], _value2[key])) {
22
+ if (!value2KeysSet.has(key) || !deepEqual(value1[key], value2[key])) {
24
23
  return false;
25
24
  }
26
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"deepEqual.js","sourceRoot":"","sources":["../../src/utils/deepEqual.ts"],"names":[],"mappings":"AACA,aAAa;AACb,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAe,EAAE,MAAe;IACxD,sBAAsB;IACtB,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,qBAAqB;IACrB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,eAAe;IACf,MAAM,OAAO,GAAG,MAAqB,CAAC;IACtC,MAAM,OAAO,GAAG,MAAqB,CAAC;IACtC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAExC,IAAI,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACxE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"deepEqual.js","sourceRoot":"","sources":["../../src/utils/deepEqual.ts"],"names":[],"mappings":"AACA,aAAa;AACb,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAe,EAAE,MAAe;IACxD,sBAAsB;IACtB,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,qBAAqB;IACrB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,eAAe;IACf,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,eAAe;IACf,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAEnD,IAAI,UAAU,CAAC,MAAM,KAAK,aAAa,CAAC,IAAI,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACpE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,4 +1,5 @@
1
1
  /**
2
- * 判断一个值是否为空对象 `{}`
2
+ * 判断一个值是否为空的普通对象 `{}`
3
+ * 有symblo和非枚举属性的对象会返回 `false`
3
4
  */
4
- export declare function isEmptyObject(obj: object): boolean;
5
+ export declare function isEmptyObject(value: unknown): boolean;
@@ -1,11 +1,12 @@
1
1
  /**
2
- * 判断一个值是否为空对象 `{}`
2
+ * 判断一个值是否为空的普通对象 `{}`
3
+ * 有symblo和非枚举属性的对象会返回 `false`
3
4
  */
4
- export function isEmptyObject(obj) {
5
- if (typeof obj !== "object" || obj === null || Array.isArray(obj) || obj instanceof Set || obj instanceof Map
6
- || obj instanceof WeakSet || obj instanceof WeakMap) {
5
+ export function isEmptyObject(value) {
6
+ if (typeof value !== "object" || value === null || Array.isArray(value) || value instanceof Set || value instanceof Map
7
+ || value instanceof WeakSet || value instanceof WeakMap) {
7
8
  return false;
8
9
  }
9
- return Reflect.ownKeys(obj).length === 0;
10
+ return Reflect.ownKeys(value).length === 0;
10
11
  }
11
12
  //# sourceMappingURL=isEmptyObject.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"isEmptyObject.js","sourceRoot":"","sources":["../../src/utils/isEmptyObject.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IACE,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,YAAY,GAAG,IAAI,GAAG,YAAY,GAAG;WACtG,GAAG,YAAY,OAAO,IAAI,GAAG,YAAY,OAAO,EACnD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"isEmptyObject.js","sourceRoot":"","sources":["../../src/utils/isEmptyObject.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IACE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,GAAG,IAAI,KAAK,YAAY,GAAG;WAChH,KAAK,YAAY,OAAO,IAAI,KAAK,YAAY,OAAO,EACvD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { IfContains } from "hry-types/src/Any/IfContains";
2
+ /**
3
+ * 使用此函数代替!断言
4
+ * @param value 类型中必须包含 null 或 undefined
5
+ * @returns 去除 null 和 undefined 后的类型
6
+ */
7
+ export declare function nonNullable<T>(value: IfContains<T, null | undefined, T, "参数类型必须包含 null 或 undefined">): NonNullable<T>;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 使用此函数代替!断言
3
+ * @param value 类型中必须包含 null 或 undefined
4
+ * @returns 去除 null 和 undefined 后的类型
5
+ */
6
+ export function nonNullable(value) {
7
+ /* istanbul ignore next */
8
+ if (value === null || value === undefined) {
9
+ throw new Error(`${value} should not be null or undefined`);
10
+ }
11
+ return value;
12
+ }
13
+ //# sourceMappingURL=nonNullable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nonNullable.js","sourceRoot":"","sources":["../../src/utils/nonNullable.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,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.8.1",
3
+ "version": "1.8.3",
4
4
  "description": "微信小程序(原生开发)插件",
5
5
  "main": "dist/index.js",
6
6
  "types": "src/index.ts",
@@ -17,7 +17,7 @@
17
17
  "tsc": "tsc --watch",
18
18
  "test": "jest --watch",
19
19
  "build": "tsc -p tsconfig.build.json",
20
- "check": "eslint . --fix --max-warnings 0 && (dprint check || (dprint fmt && exit 1)) "
20
+ "check": "tsc --noEmit && eslint . --fix --max-warnings 0 && (dprint check || (dprint fmt && exit 1)) "
21
21
  },
22
22
  "devDependencies": {
23
23
  "@commitlint/config-conventional": "^17.6.5",
@@ -5,9 +5,9 @@ import { getPathsValue } from "./getPathsValue";
5
5
  import { getPropertiesValue } from "./getPropertiesValue";
6
6
  import { initComputedAndGetCache } from "./initComputedAndGetCache";
7
7
 
8
- import { assertNonNullable } from "../../../../utils/assertNonNullable";
9
8
  import { deepClone } from "../../../../utils/deepClone";
10
9
  import { isEmptyObject } from "../../../../utils/isEmptyObject";
10
+ import { nonNullable } from "../../../../utils/nonNullable";
11
11
  import type { Instance } from "../../../RootComponent/Instance/RootComponentInstance";
12
12
  import type { FinalOptionsOfComponent } from "..";
13
13
 
@@ -68,7 +68,7 @@ export function computedWatchHandle(options: FinalOptionsOfComponent) {
68
68
  observersConfig[key] = function(this: Instance, ...newValue: unknown[]) {
69
69
  originObserversHandle?.call(this, ...newValue);
70
70
 
71
- const watchOldValue = assertNonNullable(this.data.__watchOldValue__);
71
+ const watchOldValue = nonNullable(this.data.__watchOldValue__);
72
72
  const oldValue = watchOldValue[key];
73
73
 
74
74
  if (deepEqual(newValue, oldValue)) return;
@@ -10,7 +10,7 @@ import type {
10
10
  WMBaseEvent,
11
11
  WMCustomEvent,
12
12
  } from "../../../../types/OfficialTypeAlias";
13
- import { assertNonNullable } from "../../../../utils/assertNonNullable";
13
+ import { nonNullable } from "../../../../utils/nonNullable";
14
14
  import type { ComponentType } from "../../../DefineComponent/ReturnType/ComponentType";
15
15
  import { RootComponent } from "../..";
16
16
  import type { Bubbles, Capture } from "../../CustomEvents/CustomEventsTag";
@@ -42,7 +42,7 @@ RootComponent()({
42
42
  ) {
43
43
  Checking<typeof e.detail, string, Test.Pass>;
44
44
 
45
- const markData = assertNonNullable(e.mark).markData;
45
+ const markData = nonNullable(e.mark).markData;
46
46
 
47
47
  Checking<typeof markData, { id: string }, Test.Pass>;
48
48
 
@@ -9,7 +9,8 @@ type _SubComponentType = {
9
9
  | boolean
10
10
  | symbol
11
11
  | null
12
- | Record<string, unknown>
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ | Record<string, any>
13
14
  | unknown[]
14
15
  | CustomEventsTags;
15
16
  };
@@ -160,3 +160,11 @@ SubComponent<Root, $aaa>()({
160
160
  },
161
161
  },
162
162
  });
163
+ // computed中可写 额外字段 isReady
164
+ SubComponent<{ data: { _num: number } }, $aaa>()({
165
+ computed: {
166
+ aaa_isReady() {
167
+ return true;
168
+ },
169
+ },
170
+ });
@@ -48,7 +48,7 @@ SubComponent<{}, CompDoc>()({
48
48
  },
49
49
  methods: {
50
50
  aaa_1() {
51
- // 4 this.data中的data配置数据
51
+ // 4 this.data中的data配置数据类型应该与文档类型一致,比如aaa_str的类型为"a" | "b"而非string
52
52
  void Checking<
53
53
  typeof this.data,
54
54
  ComputeIntersection<
@@ -80,3 +80,9 @@ SubComponent<{ data: { _num: number } }, CompDoc>()({
80
80
  },
81
81
  },
82
82
  });
83
+ // data中可写 额外字段 isReady
84
+ SubComponent<{ data: { _num: number } }, CompDoc>()({
85
+ data: {
86
+ aaa_isReady: false,
87
+ },
88
+ });
@@ -28,3 +28,9 @@ SubComponent<{}, DocA, "a">()({
28
28
  _aaaA_xxx: () => user.age,
29
29
  },
30
30
  });
31
+ // store中可写 额外字段 isReady
32
+ SubComponent<{ data: { _num: number } }, DocA, "a">()({
33
+ store: {
34
+ aaaA_isReady: () => false,
35
+ },
36
+ });
@@ -3,6 +3,7 @@ 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
5
  import type { ComputeObject } from "../../types/ComputeObj";
6
+ import type { Extra } from "../../types/Extra";
6
7
  import type { GetComponentPrefix } from "../../types/GetComponentPrefix";
7
8
  import type { InnerFields } from "../../types/InnerData";
8
9
  import type { WMCompOtherOption } from "../../types/OfficialTypeAlias";
@@ -125,8 +126,8 @@ type SubComponentConstructor<
125
126
  CurrentCompDoc extends ComponentType = IfExtends<
126
127
  TSupplementalPrefix,
127
128
  "",
128
- TOriginalCompDoc,
129
- ReplacePrefix<TOriginalCompDoc, CurrentPrefix>
129
+ TOriginalCompDoc & { properties: Extra<CurrentPrefix> }, // 为文档增加格外字段
130
+ ReplacePrefix<TOriginalCompDoc & { properties: Extra<CurrentPrefix> }, CurrentPrefix> // 为文档增加格外字段
130
131
  >,
131
132
  AllRootDataDoc extends object =
132
133
  // rootDoc中的properties是带有可选的,这是为了给使用者(上层组件)提示,而在自身组件实例中并不存在可选状态,故加了Required,正因加了Required使得最终结果不可能为unknown而是`{}`,满足object约束
@@ -1 +1 @@
1
- // export type Extra<Prefix extends string> = Record<`${Prefix}_isReady`, boolean>;
1
+ export type Extra<Prefix extends string> = { [K in `${Prefix}_isReady`]?: boolean };
@@ -1,8 +1,8 @@
1
- import { assertNonNullable } from "./assertNonNullable";
2
1
  import { debounce } from "./debounce";
3
2
  import { deepClone } from "./deepClone";
4
3
  import { deepEqual } from "./deepEqual";
5
4
  import { isEmptyObject } from "./isEmptyObject";
5
+ import { nonNullable } from "./nonNullable";
6
6
  import { throttle } from "./throttle";
7
7
 
8
- export { assertNonNullable, debounce, deepClone, deepEqual, isEmptyObject, throttle };
8
+ export { debounce, deepClone, deepEqual, isEmptyObject, nonNullable, throttle };
@@ -1,11 +1,12 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
1
  /**
3
2
  * 防抖函数
4
- * 应用在输入框输入时,只有在输入完成并delay后,才会触发搜索
3
+ * 注意 需要在tsconfig.json的types中添加"node",否则NodeJS.Timeout会报错
4
+ * 例如 应用在输入框输入时,只有在输入完成并delay后,才会触发搜索,
5
5
  * @param func
6
6
  * @param delay
7
7
  * @returns
8
8
  */
9
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
10
  export function debounce<F extends (...args: any[]) => any>(func: F, delay: number): (...args: Parameters<F>) => void {
10
11
  let timeoutId: NodeJS.Timeout | null = null;
11
12
 
@@ -1,8 +1,8 @@
1
1
  /**
2
- * 深度克隆 函数相同 原型一致
2
+ * 数组和普通对象的深度克隆,原型相同
3
3
  */
4
4
  export function deepClone<T>(value: T): T {
5
- if (typeof value !== "object" || value === null || value instanceof RegExp) {
5
+ if (typeof value !== "object" || value === null) {
6
6
  return value;
7
7
  }
8
8
 
@@ -1,11 +1,11 @@
1
1
  type PlainObject = Record<string, unknown>;
2
2
  // 非null的对象类型
3
- function isNonNullObject(value: unknown): boolean {
3
+ function isNonNullObject(value: unknown): value is PlainObject {
4
4
  return value !== null && typeof value === "object";
5
5
  }
6
6
 
7
7
  export function deepEqual(value1: unknown, value2: unknown): boolean {
8
- // 2个非对象类型相等或同引用对象的情况。
8
+ // 两个非对象类型相等或同引用对象的情况。
9
9
  if (Object.is(value1, value2)) {
10
10
  return true;
11
11
  }
@@ -13,18 +13,17 @@ export function deepEqual(value1: unknown, value2: unknown): boolean {
13
13
  if (!isNonNullObject(value1) || !isNonNullObject(value2)) {
14
14
  return false;
15
15
  }
16
- // 到此,2个都是对象类型。
17
- const _value1 = value1 as PlainObject;
18
- const _value2 = value2 as PlainObject;
19
- const value1Keys = Object.keys(_value1);
20
- const value2Keys = Object.keys(_value2);
16
+ // 到此两个值都是对象类型。
17
+ const value1Keys = Object.keys(value1);
18
+ // 使用Set提高查找效率。
19
+ const value2KeysSet = new Set(Object.keys(value2));
21
20
 
22
- if (value1Keys.length !== value2Keys.length) {
21
+ if (value1Keys.length !== value2KeysSet.size) {
23
22
  return false;
24
23
  }
25
24
 
26
25
  for (const key of value1Keys) {
27
- if (!value2Keys.includes(key) || !deepEqual(_value1[key], _value2[key])) {
26
+ if (!value2KeysSet.has(key) || !deepEqual(value1[key], value2[key])) {
28
27
  return false;
29
28
  }
30
29
  }
@@ -1,13 +1,14 @@
1
1
  /**
2
- * 判断一个值是否为空对象 `{}`
2
+ * 判断一个值是否为空的普通对象 `{}`
3
+ * 有symblo和非枚举属性的对象会返回 `false`
3
4
  */
4
- export function isEmptyObject(obj: object): boolean {
5
+ export function isEmptyObject(value: unknown): boolean {
5
6
  if (
6
- typeof obj !== "object" || obj === null || Array.isArray(obj) || obj instanceof Set || obj instanceof Map
7
- || obj instanceof WeakSet || obj instanceof WeakMap
7
+ typeof value !== "object" || value === null || Array.isArray(value) || value instanceof Set || value instanceof Map
8
+ || value instanceof WeakSet || value instanceof WeakMap
8
9
  ) {
9
10
  return false;
10
11
  }
11
12
 
12
- return Reflect.ownKeys(obj).length === 0;
13
+ return Reflect.ownKeys(value).length === 0;
13
14
  }
@@ -1,6 +1,11 @@
1
1
  import type { IfContains } from "hry-types/src/Any/IfContains";
2
2
 
3
- export function assertNonNullable<T>(
3
+ /**
4
+ * 使用此函数代替!断言
5
+ * @param value 类型中必须包含 null 或 undefined
6
+ * @returns 去除 null 和 undefined 后的类型
7
+ */
8
+ export function nonNullable<T>(
4
9
  value: IfContains<T, null | undefined, T, "参数类型必须包含 null 或 undefined">,
5
10
  ): NonNullable<T> {
6
11
  /* istanbul ignore next */
@@ -1,2 +0,0 @@
1
- import type { IfContains } from "hry-types/src/Any/IfContains";
2
- export declare function assertNonNullable<T>(value: IfContains<T, null | undefined, T, "参数类型必须包含 null 或 undefined">): NonNullable<T>;
@@ -1,8 +0,0 @@
1
- export function assertNonNullable(value) {
2
- /* istanbul ignore next */
3
- if (value === null || value === undefined) {
4
- throw new Error(`${value} should not be null or undefined`);
5
- }
6
- return value;
7
- }
8
- //# sourceMappingURL=assertNonNullable.js.map
@@ -1 +0,0 @@
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"}