type-plus 4.7.0 → 4.8.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.
package/README.md CHANGED
@@ -427,6 +427,7 @@ So you may encounter some weird behavior if your logic is complex.
427
427
 
428
428
  ### Utility Functions
429
429
 
430
+ - `amend(subject)...`: amend subject as union or intersect of `T`.
430
431
  - `facade(subject, ...props)`: create a facade of `subject`.
431
432
  - `getField(subject, key, defaultValue)`: get a field from a subject. Works against nullable and optional subject.
432
433
  - `hasKey()`: function of `HasKey`.
package/cjs/utils/as.d.ts CHANGED
@@ -1,2 +1,6 @@
1
1
  export declare function as<T>(subject: unknown): T;
2
2
  export declare function asAny(subject: unknown): any;
3
+ export declare function amend<S>(subject: S): {
4
+ union<T>(): T & S;
5
+ intersect<T_1>(): S | T_1;
6
+ };
package/cjs/utils/as.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.asAny = exports.as = void 0;
3
+ exports.amend = exports.asAny = exports.as = void 0;
4
4
  function as(subject) {
5
5
  return subject;
6
6
  }
@@ -9,4 +9,11 @@ function asAny(subject) {
9
9
  return subject;
10
10
  }
11
11
  exports.asAny = asAny;
12
+ function amend(subject) {
13
+ return {
14
+ union: function () { return subject; },
15
+ intersect: function () { return subject; }
16
+ };
17
+ }
18
+ exports.amend = amend;
12
19
  //# sourceMappingURL=as.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"as.js","sourceRoot":"","sources":["../../ts/utils/as.ts"],"names":[],"mappings":";;;AAAA,SAAgB,EAAE,CAAI,OAAgB;IACpC,OAAO,OAAY,CAAA;AACrB,CAAC;AAFD,gBAEC;AAED,SAAgB,KAAK,CAAC,OAAgB;IACpC,OAAO,OAAO,CAAA;AAChB,CAAC;AAFD,sBAEC"}
1
+ {"version":3,"file":"as.js","sourceRoot":"","sources":["../../ts/utils/as.ts"],"names":[],"mappings":";;;AAAA,SAAgB,EAAE,CAAI,OAAgB;IACpC,OAAO,OAAY,CAAA;AACrB,CAAC;AAFD,gBAEC;AAED,SAAgB,KAAK,CAAC,OAAgB;IACpC,OAAO,OAAO,CAAA;AAChB,CAAC;AAFD,sBAEC;AAKD,SAAgB,KAAK,CAAI,OAAU;IACjC,OAAO;QACL,KAAK,EAAL,cAAoB,OAAO,OAAgB,CAAA,CAAC,CAAC;QAC7C,SAAS,EAAT,cAAwB,OAAO,OAAgB,CAAA,CAAC,CAAC;KAClD,CAAA;AACH,CAAC;AALD,sBAKC"}
package/esm/utils/as.js CHANGED
@@ -4,4 +4,10 @@ export function as(subject) {
4
4
  export function asAny(subject) {
5
5
  return subject;
6
6
  }
7
+ export function amend(subject) {
8
+ return {
9
+ union() { return subject; },
10
+ intersect() { return subject; }
11
+ };
12
+ }
7
13
  //# sourceMappingURL=as.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"as.js","sourceRoot":"","sources":["../../ts/utils/as.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,EAAE,CAAI,OAAgB;IACpC,OAAO,OAAY,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAgB;IACpC,OAAO,OAAO,CAAA;AAChB,CAAC"}
1
+ {"version":3,"file":"as.js","sourceRoot":"","sources":["../../ts/utils/as.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,EAAE,CAAI,OAAgB;IACpC,OAAO,OAAY,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAgB;IACpC,OAAO,OAAO,CAAA;AAChB,CAAC;AAKD,MAAM,UAAU,KAAK,CAAI,OAAU;IACjC,OAAO;QACL,KAAK,KAAe,OAAO,OAAgB,CAAA,CAAC,CAAC;QAC7C,SAAS,KAAe,OAAO,OAAgB,CAAA,CAAC,CAAC;KAClD,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "type-plus",
3
- "version": "4.7.0",
3
+ "version": "4.8.0",
4
4
  "description": "Provides additional types for TypeScript.",
5
5
  "homepage": "https://github.com/unional/type-plus",
6
6
  "bugs": {
@@ -1,4 +1,4 @@
1
- import { as, asAny, isType } from '..'
1
+ import { amend, as, asAny, isType } from '..'
2
2
 
3
3
  describe('as<T>()', () => {
4
4
  test('defaults subject type to unknown', () => {
@@ -31,3 +31,15 @@ describe('asAny()', () => {
31
31
  })
32
32
  })
33
33
 
34
+ describe('amend<T>()', () => {
35
+ test('assert subject as (subject & T)', () => {
36
+ const s = { a: 1 }
37
+ const a = amend(s).union<{ b: string }>()
38
+ isType.equal<true, { a: number } & { b: string }, typeof a>()
39
+ })
40
+ test('assert subject as (subject | T)', () => {
41
+ const s = { a: 1 }
42
+ const a = amend(s).intersect<{ b: string }>()
43
+ isType.equal<true, { a: number } | { b: string }, typeof a>()
44
+ })
45
+ })
package/ts/utils/as.ts CHANGED
@@ -5,3 +5,13 @@ export function as<T>(subject: unknown): T {
5
5
  export function asAny(subject: unknown): any {
6
6
  return subject
7
7
  }
8
+
9
+ /**
10
+ * amend `subject` with type `T`
11
+ */
12
+ export function amend<S>(subject: S) {
13
+ return {
14
+ union<T>(): T & S { return subject as T & S },
15
+ intersect<T>(): T | S { return subject as T | S }
16
+ }
17
+ }