type-plus 3.12.1 → 3.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/README.md +35 -33
  2. package/lib/ComposableTypes.d.ts +8 -0
  3. package/lib/ComposableTypes.js +3 -0
  4. package/lib/ComposableTypes.js.map +1 -0
  5. package/lib/JSONTypes.js +10 -5
  6. package/lib/JSONTypes.js.map +1 -1
  7. package/lib/assertion/assertType.d.ts +0 -46
  8. package/lib/assertion/assertType.js +4 -4
  9. package/lib/assertion/assertType.js.map +1 -1
  10. package/lib/class/isConstructor.js +2 -2
  11. package/lib/class/isConstructor.js.map +1 -1
  12. package/lib/index.d.ts +1 -0
  13. package/lib/index.js +1 -0
  14. package/lib/index.js.map +1 -1
  15. package/lib/math/Subtract.d.ts +1 -1
  16. package/lib/nominal-types/Brand.js.map +1 -1
  17. package/lib/nominal-types/Flavor.js +1 -2
  18. package/lib/nominal-types/Flavor.js.map +1 -1
  19. package/lib/object/KnownKeys.d.ts +2 -1
  20. package/lib/object/KnownKeys.js +3 -0
  21. package/lib/object/KnownKeys.js.map +1 -1
  22. package/lib/object/facade.js +3 -0
  23. package/lib/object/facade.js.map +1 -1
  24. package/lib/object/getField.js.map +1 -1
  25. package/lib/object/hasKey.js.map +1 -1
  26. package/lib/object/mapProperties.js +1 -1
  27. package/lib/object/mapProperties.js.map +1 -1
  28. package/lib/object/omit.js +1 -1
  29. package/lib/object/omit.js.map +1 -1
  30. package/lib/object/pick.js +1 -1
  31. package/lib/object/pick.js.map +1 -1
  32. package/lib/object/typeOverrideIncompatible.js.map +1 -1
  33. package/lib/predicates/CanAssign.d.ts +2 -1
  34. package/lib/predicates/CanAssign.js.map +1 -1
  35. package/lib/predicates/index.d.ts +1 -0
  36. package/lib/predicates/index.js +1 -0
  37. package/lib/predicates/index.js.map +1 -1
  38. package/lib/predicates/isEmptyObject.d.ts +1 -0
  39. package/lib/predicates/isEmptyObject.js +3 -0
  40. package/lib/predicates/isEmptyObject.js.map +1 -0
  41. package/lib/predicates/isType.d.ts +4 -13
  42. package/lib/predicates/isType.js +3 -6
  43. package/lib/predicates/isType.js.map +1 -1
  44. package/lib/promise/isPromise.d.ts +1 -1
  45. package/lib/promise/isPromise.js +2 -1
  46. package/lib/promise/isPromise.js.map +1 -1
  47. package/lib/promise/mapSeries.js +1 -7
  48. package/lib/promise/mapSeries.js.map +1 -1
  49. package/lib/types/Number.js +10 -6
  50. package/lib/types/Number.js.map +1 -1
  51. package/lib/types/Object.d.ts +4 -20
  52. package/lib/types/Object.js +1 -1
  53. package/lib/types/Object.js.map +1 -1
  54. package/lib/types/String.js +10 -6
  55. package/lib/types/String.js.map +1 -1
  56. package/lib/types/Tuple.js +10 -6
  57. package/lib/types/Tuple.js.map +1 -1
  58. package/lib/types/Union.js +9 -5
  59. package/lib/types/Union.js.map +1 -1
  60. package/lib/types/analyze.js +3 -2
  61. package/lib/types/analyze.js.map +1 -1
  62. package/lib/types/check.js +2 -2
  63. package/lib/types/check.js.map +1 -1
  64. package/lib/types/conform.js +2 -2
  65. package/lib/types/conform.js.map +1 -1
  66. package/lib/types/getPlainAnalysisReport.js +28 -24
  67. package/lib/types/getPlainAnalysisReport.js.map +1 -1
  68. package/lib/types/optional.d.ts +4 -20
  69. package/lib/types/required.d.ts +8 -40
  70. package/lib/types/satisfy.js +2 -2
  71. package/lib/types/satisfy.js.map +1 -1
  72. package/libm/ComposableTypes.js +2 -0
  73. package/libm/ComposableTypes.js.map +1 -0
  74. package/libm/JSONTypes.js +1 -0
  75. package/libm/JSONTypes.js.map +1 -1
  76. package/libm/assertion/assertType.js.map +1 -1
  77. package/libm/class/isConstructor.js +2 -1
  78. package/libm/class/isConstructor.js.map +1 -1
  79. package/libm/index.js +1 -0
  80. package/libm/index.js.map +1 -1
  81. package/libm/nominal-types/Brand.js.map +1 -1
  82. package/libm/nominal-types/Flavor.js +1 -2
  83. package/libm/nominal-types/Flavor.js.map +1 -1
  84. package/libm/object/KnownKeys.js +3 -0
  85. package/libm/object/KnownKeys.js.map +1 -1
  86. package/libm/object/facade.js +3 -0
  87. package/libm/object/facade.js.map +1 -1
  88. package/libm/object/getField.js.map +1 -1
  89. package/libm/object/hasKey.js.map +1 -1
  90. package/libm/object/omit.js.map +1 -1
  91. package/libm/object/pick.js.map +1 -1
  92. package/libm/object/typeOverrideIncompatible.js.map +1 -1
  93. package/libm/predicates/CanAssign.js.map +1 -1
  94. package/libm/predicates/index.js +1 -0
  95. package/libm/predicates/index.js.map +1 -1
  96. package/libm/predicates/isEmptyObject.js +2 -0
  97. package/libm/predicates/isEmptyObject.js.map +1 -0
  98. package/libm/predicates/isType.js +4 -5
  99. package/libm/predicates/isType.js.map +1 -1
  100. package/libm/promise/isPromise.js +2 -1
  101. package/libm/promise/isPromise.js.map +1 -1
  102. package/libm/promise/mapSeries.js +1 -7
  103. package/libm/promise/mapSeries.js.map +1 -1
  104. package/package.json +26 -29
  105. package/src/ComposableTypes.spec.ts +29 -0
  106. package/src/ComposableTypes.ts +10 -0
  107. package/src/JSONTypes.ts +2 -1
  108. package/src/UnionToIntersection.ts +1 -1
  109. package/src/assertion/assertType.spec.ts +4 -1
  110. package/src/assertion/assertType.ts +2 -2
  111. package/src/class/AnyConstructor.spec.ts +2 -2
  112. package/src/class/isConstructor.spec.ts +7 -2
  113. package/src/class/isConstructor.ts +4 -3
  114. package/src/function/AnyFunction.spec.ts +9 -9
  115. package/src/functional/Maybe.spec.ts +2 -3
  116. package/src/functional/Maybe.ts +1 -0
  117. package/src/index.ts +1 -0
  118. package/src/math/Abs.spec.ts +1 -1
  119. package/src/math/Digit.spec.ts +2 -2
  120. package/src/math/Subtract.spec.ts +1 -1
  121. package/src/math/Subtract.ts +1 -1
  122. package/src/nominal-types/Brand.ts +3 -3
  123. package/src/nominal-types/Flavor.ts +3 -5
  124. package/src/object/ExcludePropType.spec.ts +1 -1
  125. package/src/object/KnownKeys.spec.ts +1 -1
  126. package/src/object/KnownKeys.ts +13 -5
  127. package/src/object/Partial.spec.ts +4 -5
  128. package/src/object/RecursiveIntersect.spec.ts +3 -3
  129. package/src/object/Required.spec.ts +2 -2
  130. package/src/object/facade.ts +3 -0
  131. package/src/object/getField.spec.ts +3 -3
  132. package/src/object/getField.ts +2 -2
  133. package/src/object/hasKey.ts +1 -1
  134. package/src/object/hasProperty.spec.ts +3 -3
  135. package/src/object/mapProperties.spec.ts +2 -2
  136. package/src/object/omit.spec.ts +5 -5
  137. package/src/object/omit.ts +1 -1
  138. package/src/object/pick.spec.ts +1 -1
  139. package/src/object/pick.ts +1 -1
  140. package/src/object/typeOverrideIncompatible.ts +1 -1
  141. package/src/predicates/CanAssign.ts +6 -3
  142. package/src/predicates/index.ts +1 -0
  143. package/src/predicates/isEmptyObject.spec.ts +15 -0
  144. package/src/predicates/isEmptyObject.ts +2 -0
  145. package/src/predicates/isType.spec.ts +2 -2
  146. package/src/predicates/isType.ts +7 -9
  147. package/src/promise/PromiseValue.spec.ts +1 -1
  148. package/src/promise/isPromise.ts +3 -2
  149. package/src/promise/mapSeries.ts +3 -7
  150. package/src/type-checker/AnyType.ts +1 -1
  151. package/src/types/satisfy.accept.ts +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Flavor.js","sourceRoot":"","sources":["../../src/nominal-types/Flavor.ts"],"names":[],"mappings":"AAAA,kHAAkH;AAClH,uEAAuE;AAGvE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAoBjC,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,OAAa;IAChD,IAAI,OAAO,KAAK,SAAS,EAAE;QACzB,OAAO,UAAU,OAAY,IAAI,OAAO,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA,CAAC,CAAC,CAAA;KAChE;IACD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE;QACnD,2EAA2E;QAC1E,OAAe,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;KACjC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
1
+ {"version":3,"file":"Flavor.js","sourceRoot":"","sources":["../../src/nominal-types/Flavor.ts"],"names":[],"mappings":"AAAA,kHAAkH;AAClH,uEAAuE;AAGvE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAoBjC,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,OAAiB;IACpD,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,UAAa,OAAU,IAAI,OAAO,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA,CAAC,CAAC,CAAA;IAC3F,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE;QACnD,2EAA2E;QAC1E,OAAiC,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;KACnD;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -1,2 +1,5 @@
1
+ // Original by Klaus Meinhardt @ajafff
2
+ // known from Gerrit Birkeland @Gerrit0
3
+ // https://github.com/Microsoft/TypeScript/issues/25987#issuecomment-408339599
1
4
  export {};
2
5
  //# sourceMappingURL=KnownKeys.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"KnownKeys.js","sourceRoot":"","sources":["../../src/object/KnownKeys.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"KnownKeys.js","sourceRoot":"","sources":["../../src/object/KnownKeys.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,uCAAuC;AACvC,8EAA8E"}
@@ -2,14 +2,17 @@ export function facade(subject, ...props) {
2
2
  return props.reduce((p, k) => {
3
3
  const prop = subject[k];
4
4
  if (typeof prop === 'function') {
5
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
5
6
  p[k] = prop.bind(subject);
6
7
  }
7
8
  else {
8
9
  Object.defineProperty(p, k, {
9
10
  get() {
11
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
10
12
  return subject[k];
11
13
  },
12
14
  set(value) {
15
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-assignment
13
16
  return subject[k] = value;
14
17
  },
15
18
  });
@@ -1 +1 @@
1
- {"version":3,"file":"facade.js","sourceRoot":"","sources":["../../src/object/facade.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,MAAM,CAAsB,OAAU,EAAE,GAAG,KAAkB;IAC3E,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;QACvB,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE;YAC9B,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;SAC1B;aACI;YACH,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE;gBAC1B,GAAG;oBACD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAA;gBACnB,CAAC;gBACD,GAAG,CAAC,KAAU;oBACZ,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;gBAC3B,CAAC;aACF,CAAC,CAAA;SACH;QACD,OAAO,CAAC,CAAA;IACV,CAAC,EAAE,EAAO,CAAC,CAAA;AACb,CAAC"}
1
+ {"version":3,"file":"facade.js","sourceRoot":"","sources":["../../src/object/facade.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,MAAM,CAAsB,OAAU,EAAE,GAAG,KAAkB;IAC3E,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;QACvB,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE;YAC9B,sGAAsG;YACtG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;SAC1B;aACI;YACH,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE;gBAC1B,GAAG;oBACD,+DAA+D;oBAC/D,OAAO,OAAO,CAAC,CAAC,CAAC,CAAA;gBACnB,CAAC;gBACD,GAAG,CAAC,KAAU;oBACZ,wGAAwG;oBACxG,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;gBAC3B,CAAC;aACF,CAAC,CAAA;SACH;QACD,OAAO,CAAC,CAAA;IACV,CAAC,EAAE,EAAO,CAAC,CAAA;AACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"getField.js","sourceRoot":"","sources":["../../src/object/getField.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,QAAQ,CAKtB,OAAU,EAAE,GAAM,EAAE,YAAiB;IACrC,OAAO,OAAO,IAAK,OAAe,CAAC,GAAG,CAAC,IAAI,YAAY,CAAA;AACzD,CAAC"}
1
+ {"version":3,"file":"getField.js","sourceRoot":"","sources":["../../src/object/getField.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,QAAQ,CAKtB,OAAU,EAAE,GAAM,EAAE,YAAiB;IACrC,OAAO,OAAO,IAAK,OAA+C,CAAC,GAAG,CAAC,IAAI,YAAY,CAAA;AACzF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"hasKey.js","sourceRoot":"","sources":["../../src/object/hasKey.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,MAAM,CAAwC,OAAU,EAAE,GAAG,IAAS;IACpF,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAQ,CAAA;AAChD,CAAC"}
1
+ {"version":3,"file":"hasKey.js","sourceRoot":"","sources":["../../src/object/hasKey.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,MAAM,CAAwC,OAAU,EAAE,GAAG,IAAS;IACpF,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAA4B,CAAA;AACpE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"omit.js","sourceRoot":"","sources":["../../src/object/omit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,WAAW,EAAE,MAAM,WAAW,CAAA;AA8BlD,MAAM,UAAU,IAAI,CAAsB,OAAU,EAAE,GAAG,KAA0B;IACjF,OAAO,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAAE,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;QAC9C,OAAO,CAAC,CAAA;IACV,CAAC,EAAE,EAAS,CAAC,CAAA;AACf,CAAC"}
1
+ {"version":3,"file":"omit.js","sourceRoot":"","sources":["../../src/object/omit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,WAAW,EAAE,MAAM,WAAW,CAAA;AA8BlD,MAAM,UAAU,IAAI,CAAsB,OAAU,EAAE,GAAG,KAA0B;IACjF,OAAO,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAAE,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;QAC9C,OAAO,CAAC,CAAA;IACV,CAAC,EAAE,EAAe,CAAC,CAAA;AACrB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"pick.js","sourceRoot":"","sources":["../../src/object/pick.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAczC,MAAM,UAAU,IAAI,CAAsB,OAAU,EAAE,GAAG,KAA0B;IACjF,OAAO,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;QAC5C,OAAO,CAAC,CAAA;IACV,CAAC,EAAE,EAAS,CAAC,CAAA;AACf,CAAC"}
1
+ {"version":3,"file":"pick.js","sourceRoot":"","sources":["../../src/object/pick.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAczC,MAAM,UAAU,IAAI,CAAsB,OAAU,EAAE,GAAG,KAA0B;IACjF,OAAO,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;QAC5C,OAAO,CAAC,CAAA;IACV,CAAC,EAAE,EAAO,CAAC,CAAA;AACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"typeOverrideIncompatible.js","sourceRoot":"","sources":["../../src/object/typeOverrideIncompatible.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,wBAAwB;IACtC,OAAO,UAA+B,MAAS,EAAE,QAAqB;QACpE,OAAO;YACL,GAAG,MAAM;YACT,GAAG,QAAQ;SACL,CAAA;IACV,CAAC,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"typeOverrideIncompatible.js","sourceRoot":"","sources":["../../src/object/typeOverrideIncompatible.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,wBAAwB;IACtC,OAAO,UAA+B,MAAS,EAAE,QAAqB;QACpE,OAAO;YACL,GAAG,MAAM;YACT,GAAG,QAAQ;SACZ,CAAA;IACH,CAAC,CAAA;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"CanAssign.js","sourceRoot":"","sources":["../../src/predicates/CanAssign.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,SAAS;IACvB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAA;AACnB,CAAC"}
1
+ {"version":3,"file":"CanAssign.js","sourceRoot":"","sources":["../../src/predicates/CanAssign.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,SAAS;IACvB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAA;AACnB,CAAC"}
@@ -4,4 +4,5 @@ export * from './Extends';
4
4
  export * from './If';
5
5
  export * from './isType';
6
6
  export * from './logical';
7
+ export * from './isEmptyObject';
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/predicates/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,MAAM,CAAA;AACpB,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/predicates/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,MAAM,CAAA;AACpB,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,iBAAiB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=isEmptyObject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isEmptyObject.js","sourceRoot":"","sources":["../../src/predicates/isEmptyObject.ts"],"names":[],"mappings":""}
@@ -8,12 +8,11 @@ export function isType(subject, validator) {
8
8
  }
9
9
  return true;
10
10
  }
11
- const sym = Symbol();
12
- isType.t = function (subject = sym) {
13
- return subject === sym || subject === true;
11
+ isType.t = function (subject) {
12
+ return subject === undefined || subject === true;
14
13
  };
15
- isType.f = function (subject = sym) {
16
- return subject === sym || subject === false;
14
+ isType.f = function (subject) {
15
+ return subject === undefined || subject === false;
17
16
  };
18
17
  /**
19
18
  * are types A and B equals/not equals.
@@ -1 +1 @@
1
- {"version":3,"file":"isType.js","sourceRoot":"","sources":["../../src/predicates/isType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAMxC,MAAM,UAAU,MAAM,CAAC,OAAY,EAAE,SAAe;IAClD,IAAI,SAAS,EAAE;QACb,IAAI,aAAa,CAAC,SAAS,CAAC;YAC1B,OAAO,OAAO,YAAY,SAAS,CAAA;;YAEnC,OAAO,SAAS,CAAC,OAAO,CAAC,CAAA;KAC5B;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,GAAG,GAAG,MAAM,EAAE,CAAA;AAEpB,MAAM,CAAC,CAAC,GAAG,UAA0B,UAAa,GAAU;IAC1D,OAAQ,OAAe,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,CAAA;AACrD,CAAC,CAAA;AACD,MAAM,CAAC,CAAC,GAAG,UAA2B,UAAa,GAAU;IAC3D,OAAQ,OAAe,KAAK,GAAG,IAAI,OAAO,KAAK,KAAK,CAAA;AACtD,CAAC,CAAA;AAED;;;;GAIG;AACH,6DAA6D;AAC7D,MAAM,CAAC,KAAK,GAAG,cAA2C,CAAC,CAAA"}
1
+ {"version":3,"file":"isType.js","sourceRoot":"","sources":["../../src/predicates/isType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,aAAa,EAAE,MAAM,UAAU,CAAA;AAMxD,MAAM,UAAU,MAAM,CAAC,OAAgB,EAAE,SAAsD;IAC7F,IAAI,SAAS,EAAE;QACb,IAAI,aAAa,CAAC,SAAS,CAAC;YAC1B,OAAO,OAAO,YAAY,SAAS,CAAA;;YAEnC,OAAO,SAAS,CAAC,OAAO,CAAC,CAAA;KAC5B;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,CAAC,CAAC,GAAG,UAA0B,OAAW;IAC9C,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,CAAA;AAClD,CAAC,CAAA;AACD,MAAM,CAAC,CAAC,GAAG,UAA2B,OAAW;IAC/C,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,CAAA;AACnD,CAAC,CAAA;AAED;;;;GAIG;AACH,6DAA6D;AAC7D,MAAM,CAAC,KAAK,GAAG,cAA2C,CAAC,CAAA"}
@@ -1,4 +1,5 @@
1
1
  export function isPromise(subject) {
2
- return !!subject && typeof subject.then === 'function';
2
+ // @ts-ignore
3
+ return !!subject && typeof subject['then'] === 'function';
3
4
  }
4
5
  //# sourceMappingURL=isPromise.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"isPromise.js","sourceRoot":"","sources":["../../src/promise/isPromise.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAU,OAAY;IAC7C,OAAO,CAAC,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,UAAU,CAAA;AACxD,CAAC"}
1
+ {"version":3,"file":"isPromise.js","sourceRoot":"","sources":["../../src/promise/isPromise.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAU,OAAgB;IACjD,aAAa;IACb,OAAO,CAAC,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,UAAU,CAAA;AAC3D,CAAC"}
@@ -1,10 +1,4 @@
1
1
  export function mapSeries(values, fn) {
2
- const results = [];
3
- return values.reduce((p, v) => {
4
- return p.then(() => fn(v)).then((r) => {
5
- results.push(r);
6
- return results;
7
- });
8
- }, Promise.resolve());
2
+ return values.reduce((p, v) => p.then(r => fn(v).then(v => (r.push(v), r))), Promise.resolve([]));
9
3
  }
10
4
  //# sourceMappingURL=mapSeries.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mapSeries.js","sourceRoot":"","sources":["../../src/promise/mapSeries.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAa,MAAW,EAAE,EAA4B;IAC7E,MAAM,OAAO,GAAQ,EAAE,CAAA;IACvB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC5B,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACf,OAAO,OAAO,CAAA;QAChB,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,OAAO,CAAC,OAAO,EAAS,CAAC,CAAA;AAC9B,CAAC"}
1
+ {"version":3,"file":"mapSeries.js","sourceRoot":"","sources":["../../src/promise/mapSeries.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAa,MAAW,EAAE,EAA4B;IAC7E,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EACtD,OAAO,CAAC,OAAO,CAAM,EAAE,CAAC,CAAC,CAAA;AAC7B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "type-plus",
3
- "version": "3.12.1",
3
+ "version": "3.14.0",
4
4
  "description": "Provides additional types for `typescript`.",
5
5
  "homepage": "https://github.com/unional/type-plus",
6
6
  "bugs": {
@@ -30,14 +30,13 @@
30
30
  "clean": "rimraf coverage lib libm",
31
31
  "codacy": "cat coverage/lcov.info | codacy-coverage",
32
32
  "codecov": "codecov",
33
- "coverage": "jest --coverage",
33
+ "coverage": "tsc -p tsconfig.json && jest --coverage",
34
34
  "dc": "yarn dependency-check",
35
35
  "depcheck": "yarn dependency-check",
36
36
  "dependency-check": "dependency-check . --unused --no-dev -i ts-toolbelt -i typescript && dependency-check . --missing --no-dev",
37
37
  "lint": "eslint --ext=ts,js .",
38
38
  "nuke": "yarn clean && rimraf node_modules",
39
- "semantic-release": "semantic-release",
40
- "test": "jest",
39
+ "test": "tsc -p tsconfig.json && jest",
41
40
  "verify": "yarn lint && yarn build && yarn dc && npx size-limit && yarn coverage",
42
41
  "verify:ci": "yarn lint && yarn build && yarn dc && npx size-limit && yarn coverage --maxWorkers=2",
43
42
  "watch": "jest --watch"
@@ -52,44 +51,42 @@
52
51
  "unpartial": "^0.6.3"
53
52
  },
54
53
  "devDependencies": {
55
- "@babel/cli": "^7.14.3",
56
- "@babel/core": "^7.14.3",
57
- "@babel/plugin-proposal-class-properties": "^7.13.0",
58
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.2",
59
- "@babel/plugin-proposal-optional-chaining": "^7.14.2",
60
- "@babel/preset-env": "^7.14.4",
61
- "@babel/preset-typescript": "^7.13.0",
62
- "@commitlint/cli": "^12.1.4",
63
- "@commitlint/config-conventional": "^12.1.4",
64
- "@size-limit/preset-small-lib": "^4.11.0",
65
- "@types/jest": "^26.0.23",
54
+ "@babel/cli": "^7.16.0",
55
+ "@babel/core": "^7.16.0",
56
+ "@babel/plugin-proposal-class-properties": "^7.16.0",
57
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0",
58
+ "@babel/plugin-proposal-optional-chaining": "^7.16.0",
59
+ "@babel/preset-env": "^7.16.4",
60
+ "@babel/preset-typescript": "^7.16.0",
61
+ "@commitlint/cli": "^15.0.0",
62
+ "@commitlint/config-conventional": "^15.0.0",
63
+ "@size-limit/preset-small-lib": "^7.0.3",
64
+ "@types/jest": "^27.0.3",
66
65
  "@unional/fixture": "^1.7.2",
67
66
  "assertron": "^7.1.3",
68
- "codecov": "^3.8.2",
69
- "commitlint-circle": "^1.0.0",
67
+ "codecov": "^3.8.3",
70
68
  "dependency-check": "^4.1.0",
71
69
  "eslint": "^7.28.0",
72
- "eslint-plugin-harmony": "^5.1.0",
73
- "husky": "^6.0.0",
74
- "is-ci": "^3.0.0",
75
- "jest": "^27.0.4",
76
- "jest-junit": "^12.1.0",
70
+ "eslint-plugin-harmony": "^6.0.0",
71
+ "husky": "^7.0.4",
72
+ "is-ci": "^3.0.1",
73
+ "jest": "^27.4.3",
74
+ "jest-junit": "^13.0.0",
77
75
  "jest-progress-tracker": "^2.0.2",
78
- "jest-validate": "^27.0.2",
76
+ "jest-validate": "^27.4.2",
79
77
  "jest-watch-suspend": "^1.1.2",
80
78
  "jest-watch-toggle-config": "^2.0.1",
81
- "jest-watch-typeahead": "^0.6.4",
82
- "npm-check-updates": "^11.6.0",
79
+ "jest-watch-typeahead": "^1.0.0",
80
+ "npm-check-updates": "^12.0.2",
83
81
  "rimraf": "^3.0.2",
84
82
  "satisfier": "^5.1.0",
85
- "semantic-release": "^17.4.3",
86
- "size-limit": "^4.11.0",
83
+ "size-limit": "^7.0.3",
87
84
  "ts-toolbelt": "^9.6.0",
88
- "typescript": "^4.3.2"
85
+ "typescript": "^4.5.2"
89
86
  },
90
87
  "size-limit": [
91
88
  {
92
- "limit": "10 kb"
89
+ "limit": "15 kb"
93
90
  }
94
91
  ]
95
92
  }
@@ -0,0 +1,29 @@
1
+ import { assertType, canAssign, ComposableTypes, NonComposableTypes } from '.'
2
+
3
+ test('ComposableTypes includes object, array, and function', () => {
4
+ assertType<ComposableTypes>({})
5
+ assertType<ComposableTypes>([])
6
+ // function is composable because you can do
7
+ // `Object.assign(fn, { ... })
8
+ assertType<ComposableTypes>(() => { })
9
+
10
+ assertType.isTrue(canAssign<ComposableTypes>(false)(null))
11
+ assertType.isTrue(canAssign<ComposableTypes>(false)(undefined))
12
+ assertType.isTrue(canAssign<ComposableTypes>(false)(1))
13
+ assertType.isTrue(canAssign<ComposableTypes>(false)(true))
14
+ assertType.isTrue(canAssign<ComposableTypes>(false)(''))
15
+ assertType.isTrue(canAssign<ComposableTypes>(false)(Symbol()))
16
+ })
17
+
18
+ test('NonComposableType excludes object, array, and function', () => {
19
+ assertType<NonComposableTypes>(null)
20
+ assertType<NonComposableTypes>(undefined)
21
+ assertType<NonComposableTypes>(true)
22
+ assertType<NonComposableTypes>(1)
23
+ assertType<NonComposableTypes>('')
24
+ assertType<NonComposableTypes>(Symbol())
25
+
26
+ assertType.isTrue(canAssign<NonComposableTypes>(false)({}))
27
+ assertType.isTrue(canAssign<NonComposableTypes>(false)([]))
28
+ assertType.isTrue(canAssign<NonComposableTypes>(false)(() => { }))
29
+ })
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Types that can contain custom properties.
3
+ */
4
+ // eslint-disable-next-line @typescript-eslint/ban-types
5
+ export type ComposableTypes = object | Function
6
+
7
+ /**
8
+ * Types that cannot contain custom properties.
9
+ */
10
+ export type NonComposableTypes = boolean | number | string | symbol | bigint | undefined | null
package/src/JSONTypes.ts CHANGED
@@ -13,5 +13,6 @@ function get<T extends JSONTypes>(obj: JSONTypes, ...props: Array<string | numbe
13
13
  if (props.length === 0) return obj as T
14
14
  if (typeof obj !== 'object' || obj === null) return undefined
15
15
  const p = props.shift()!
16
- return get((obj as any)[p], ...props) as T
16
+ // @ts-ignore
17
+ return get(obj[p], ...props) as T
17
18
  }
@@ -3,5 +3,5 @@
3
3
  export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never
4
4
 
5
5
  export function toIntersection<U>(union: U): UnionToIntersection<U> {
6
- return union as any
6
+ return union as any as UnionToIntersection<U>
7
7
  }
@@ -28,7 +28,10 @@ describe('assertType()', () => {
28
28
  test('Class as validator fails', () => {
29
29
  class Foo { }
30
30
  const s: unknown = 1
31
- a.throws(() => assertType(s, Foo), e => /subject fails to satisfy class Foo{}/.test(e.message))
31
+ a.throws(
32
+ () => assertType(s, Foo),
33
+ (e: Error) => /subject fails to satisfy class Foo{}/.test(e.message)
34
+ )
32
35
  })
33
36
  test('subject can be type any', () => {
34
37
  const s: any = false
@@ -9,9 +9,9 @@ import { AnyFunction } from '../function'
9
9
  export function assertType<T>(subject: T): asserts subject is T
10
10
  export function assertType<T>(subject: unknown, validator: (s: T) => boolean): asserts subject is T
11
11
  export function assertType<T extends new (...args: any) => any>(subject: unknown, constructor: T): asserts subject is InstanceType<T>
12
- export function assertType(subject: any, validator?: (s: any) => boolean) {
12
+ export function assertType(subject: unknown, validator?: (s: any) => boolean) {
13
13
  if (validator) {
14
- if ((isConstructor(validator) && !(subject instanceof validator)) || !validator(subject as any))
14
+ if ((isConstructor(validator) && !(subject instanceof validator)) || !validator(subject))
15
15
  throw new TypeError(`subject fails to satisfy ${tersify(validator)}`)
16
16
  }
17
17
  return
@@ -1,13 +1,13 @@
1
1
  import { AnyConstructor } from '..'
2
2
 
3
3
  test('basic', () => {
4
- const a: AnyConstructor = function () { } as any
4
+ const a = function () { } as any as AnyConstructor
5
5
 
6
6
  new a()
7
7
  })
8
8
 
9
9
  test('specify params with tuple', () => {
10
- const a: AnyConstructor<[count: number, value: string]> = function () { } as any
10
+ const a = function () { } as any as AnyConstructor<[count: number, value: string]>
11
11
 
12
12
  new a(1, 'a')
13
13
  })
@@ -20,11 +20,16 @@ test('check throwing constructor is still true', () => {
20
20
  })
21
21
 
22
22
  test('constructor throwing non-error', () => {
23
- class Foo { constructor() { throw 'abc' }}
23
+ class Foo { constructor() { throw 'abc' } }
24
24
  expect(isConstructor(Foo)).toBe(true)
25
25
  })
26
26
 
27
27
  test('constructor throwing undefined', () => {
28
- class Foo { constructor() { throw undefined }}
28
+ class Foo { constructor() { throw undefined } }
29
29
  expect(isConstructor(Foo)).toBe(true)
30
30
  })
31
+
32
+ test('class with params returns true', () => {
33
+ class Boo { constructor(public a: number) { } }
34
+ expect(isConstructor(Boo)).toBe(true)
35
+ })
@@ -2,10 +2,11 @@ import { AnyConstructor } from './AnyConstructor'
2
2
 
3
3
  export function isConstructor(subject: unknown): subject is AnyConstructor {
4
4
  try {
5
- new (subject as any)()
5
+ new (subject as AnyConstructor)()
6
6
  }
7
- catch (err) {
8
- if (err?.message?.indexOf('is not a constructor') >= 0) {
7
+ catch (err: any) {
8
+ const msg = err?.message as string | undefined
9
+ if (msg && msg.indexOf('is not a constructor') >= 0) {
9
10
  return false
10
11
  }
11
12
  }
@@ -1,21 +1,21 @@
1
1
  import { AnyFunction, assertType } from '..'
2
2
 
3
3
  test('basic', () => {
4
- const foo: AnyFunction = x => x
4
+ function doCallback(cb: AnyFunction) {
5
+ cb()
6
+ }
5
7
 
6
- foo()
7
- const result = foo(false)
8
-
9
- // only any can be boolean here
10
- assertType.isBoolean(result)
8
+ doCallback(() => { })
9
+ doCallback(_ => { })
10
+ doCallback((a: number, b: number) => a + b)
11
11
  })
12
12
 
13
- test('define param as tuple', () =>{
14
- const foo: AnyFunction<[number,string]> = x => x
13
+ test('define param as tuple', () => {
14
+ const foo: AnyFunction<[number, string]> = x => x
15
15
  foo(1, 'a')
16
16
  })
17
17
 
18
18
  test('define result type', () => {
19
- const foo: AnyFunction<any[], string> = x => x
19
+ const foo: AnyFunction<string[], string> = x => x
20
20
  assertType.isString(foo('a'))
21
21
  })
@@ -6,7 +6,7 @@ test('just(value) returns Maybe<T>', () => {
6
6
  })
7
7
 
8
8
  test('just(undefined) returns Maybe<T>', () => {
9
- const b: boolean | undefined = undefined as any
9
+ const b: boolean | undefined = undefined
10
10
  assertType<Maybe<boolean>>(just(b))
11
11
  })
12
12
 
@@ -38,6 +38,5 @@ test('Just<number can assign to Maybe<number>', () => {
38
38
  test('Just<string> is not assignable to Maybe<number>', () => {
39
39
  assertType.isFalse(false as CanAssign<Just<'abc'>, Maybe<number>>)
40
40
 
41
- // this is failing, which is wrong
42
- // assertType.isFalse(canAssign<Maybe<number>>()(just('abc')))
41
+ assertType.isTrue(canAssign<Maybe<number>>(false)(just('abc')))
43
42
  })
@@ -10,6 +10,7 @@ export function just<T>(value: T):
10
10
  Equal<T, undefined | null> extends true ?
11
11
  None<T> :
12
12
  Just<Widen<NonNullable<T>>> {
13
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
13
14
  return { unwrap() { return value } } as any
14
15
  }
15
16
 
package/src/index.ts CHANGED
@@ -3,6 +3,7 @@ export { required, requiredDeep } from 'unpartial'
3
3
  export * from './array'
4
4
  export * from './assertion'
5
5
  export * from './class'
6
+ export * from './ComposableTypes'
6
7
  export * from './function'
7
8
  export * from './functional'
8
9
  export * from './JSONTypes'
@@ -5,7 +5,7 @@ test('positive returns itself', () => {
5
5
  })
6
6
 
7
7
  test('negative returns positive', () => {
8
- isType.equal<true, 12345, Abs<-12345>>()
8
+ isType.equal<true, 1234, Abs<-1234>>()
9
9
  })
10
10
 
11
11
  test('number returns Fail', () => {
@@ -30,8 +30,8 @@ describe('DigitArray.ToNumber<DA>', () => {
30
30
  })
31
31
 
32
32
  test('multi digits', () => {
33
- isType.t<Equal<DigitArray.ToNumber<[1, 2, 3, 4, 5]>, 12345>>()
34
- isType.t<Equal<DigitArray.ToNumber<[1, 2, 3, 4, 15]>, 12355>>()
33
+ isType.t<Equal<DigitArray.ToNumber<[1, 2, 3, 4]>, 1234>>()
34
+ isType.t<Equal<DigitArray.ToNumber<[1, 2, 3, 5]>, 1235>>()
35
35
  })
36
36
  })
37
37
 
@@ -36,5 +36,5 @@ test('multi digits', () => {
36
36
 
37
37
  test('negative results gets Fail', () => {
38
38
  isType.equal<true, 'no~~', Subtract<1, 2, 'no~~'>>()
39
- isType.equal<true, never, Subtract<12345, 12346>>()
39
+ isType.equal<true, never, Subtract<1233, 1234>>()
40
40
  })
@@ -16,7 +16,7 @@ export type Subtract<A extends number, B extends number, Fail = never> =
16
16
  PadLeft<DA, M, 0> extends infer PDA ? PDA extends number[] ?
17
17
  PadLeft<DB, M, 0> extends infer PDB ? PDB extends number[] ?
18
18
  SubtractDigitArray<[], PDA, PDB> extends infer Result ? Result extends number[] ?
19
- Some<Result, number, 'strict'> extends true ? Fail :
19
+ Some<Result, never, 'strict'> extends true ? Fail :
20
20
  DigitArray.ToNumber<Result>
21
21
  : Fail : Fail
22
22
  : Fail : Fail
@@ -21,12 +21,12 @@ export function brand<B extends string>(type: B): <T>(subject: T) => Brand<B, Wi
21
21
  * Creates a branded value of specified type.
22
22
  */
23
23
  export function brand<B extends string, T>(type: B, subject: T): Brand<B, Widen<T>>
24
- export function brand(type: string, subject?: any) {
25
- if (subject === undefined) return function (subject: any) { return brand(type, subject) }
24
+ export function brand(type: string, subject?: unknown) {
25
+ if (subject === undefined) return function <T>(subject: T) { return brand(type, subject) }
26
26
 
27
27
  if (typeof subject === 'object' && subject !== null) {
28
28
  // if subject is not an object, the branding will exist only in type-level.
29
- (subject as any)[typeSym] = type
29
+ (subject as { [typeSym]: string })[typeSym] = type
30
30
  }
31
31
  return subject
32
32
  }
@@ -22,13 +22,11 @@ export function flavor<F extends string>(type: F): <T>(subject: T) => Flavor<F,
22
22
  * Creates a branded value of specified type.
23
23
  */
24
24
  export function flavor<F extends string, T>(type: F, subject: T): Flavor<F, Widen<T>>
25
- export function flavor(type: string, subject?: any) {
26
- if (subject === undefined) {
27
- return function (subject: any) { return flavor(type, subject) }
28
- }
25
+ export function flavor(type: string, subject?: unknown) {
26
+ if (subject === undefined) return function <T>(subject: T) { return flavor(type, subject) }
29
27
  if (typeof subject === 'object' && subject !== null) {
30
28
  // if subject is not an object, the branding will exist only in type-level.
31
- (subject as any)[typeSym] = type
29
+ (subject as { [typeSym]: string })[typeSym] = type
32
30
  }
33
31
  return subject
34
32
  }
@@ -8,6 +8,6 @@ test('exclude type R from properties of T', () => {
8
8
 
9
9
  type CustomerAgeNotNull = ExcludePropType<Customer, null>
10
10
 
11
- const x: CustomerAgeNotNull = { age: 0 } as any
11
+ const x: CustomerAgeNotNull = { name: '', age: 0 }
12
12
  assertType.isNumber(x.age)
13
13
  })
@@ -35,5 +35,5 @@ test('empty record yields never', () => {
35
35
 
36
36
 
37
37
  function getKnownKeys<T>(_value: T): KnownKeys<T> {
38
- return {} as any
38
+ return {} as unknown as KnownKeys<T>
39
39
  }
@@ -1,8 +1,16 @@
1
- // by Klaus Meinhardt @ajafff
1
+ // Original by Klaus Meinhardt @ajafff
2
2
  // known from Gerrit Birkeland @Gerrit0
3
3
  // https://github.com/Microsoft/TypeScript/issues/25987#issuecomment-408339599
4
+
5
+ import { PrimitiveTypes } from '../PrimitiveTypes'
6
+
4
7
  // https://github.com/microsoft/TypeScript/issues/25987#issuecomment-441224690
5
- export type KnownKeys<T> = {
6
- [K in keyof T]: string extends K ? never : number extends K ? never : K
7
- // eslint-disable-next-line @typescript-eslint/ban-types
8
- } extends { [_ in keyof T]: infer U } ? ({} extends U ? never : U) : never;
8
+ export type KnownKeys<T> =
9
+ T extends PrimitiveTypes
10
+ ? never
11
+ : {
12
+ [K in keyof T]: string extends K ? never : number extends K ? never : K
13
+ } extends { [_ in keyof T]: infer U }
14
+ // eslint-disable-next-line @typescript-eslint/ban-types
15
+ ? ({} extends U ? never : U)
16
+ : never
@@ -2,7 +2,7 @@ import { assertType, PartialExcept, PartialOmit, PartialPick } from '..'
2
2
 
3
3
  test('work on primitive type', () => {
4
4
  type Foo = PartialPick<number, 'toFixed'>
5
- const x: Foo = 1 as any
5
+ const x: Foo = 1
6
6
  assertType<typeof x['toFixed']>(1 as unknown as 1['toFixed'] | undefined)
7
7
  })
8
8
 
@@ -13,7 +13,7 @@ test('make picked properties optional', () => {
13
13
  c: number,
14
14
  }
15
15
 
16
- const y: PartialPick<Foo, 'a'> = { b: 1, c: 2 } as any
16
+ const y: PartialPick<Foo, 'a'> = { b: 1, c: 2 }
17
17
 
18
18
  y.a = undefined
19
19
  assertType.noUndefined(y.b)
@@ -27,8 +27,7 @@ test('make not specified properties optional', () => {
27
27
  c: number,
28
28
  }
29
29
 
30
- const y: PartialExcept<Foo, 'a'> = { a: 1 } as any
31
-
30
+ const y: PartialExcept<Foo, 'a'> = { a: 1 }
32
31
  assertType.noUndefined(y.a)
33
32
  y.b = undefined
34
33
  y.c = undefined
@@ -42,7 +41,7 @@ test('make not specified properties optional', () => {
42
41
  c: number,
43
42
  }
44
43
 
45
- const y: PartialOmit<Foo, 'a'> = { a: 1 } as any
44
+ const y: PartialOmit<Foo, 'a'> = { a: 1 }
46
45
 
47
46
  assertType.noUndefined(y.a)
48
47
  y.b = undefined