type-plus 4.0.2 → 4.1.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 +3 -2
- package/cjs/object/index.d.ts +2 -1
- package/cjs/object/index.js +1 -0
- package/cjs/object/index.js.map +1 -1
- package/cjs/object/split.d.ts +80 -0
- package/cjs/object/split.js +25 -0
- package/cjs/object/split.js.map +1 -0
- package/esm/object/index.js +1 -0
- package/esm/object/index.js.map +1 -1
- package/esm/object/split.js +8 -0
- package/esm/object/split.js.map +1 -0
- package/package.json +1 -1
- package/ts/object/index.ts +2 -2
- package/ts/object/split.spec.ts +54 -0
- package/ts/object/split.ts +191 -0
package/README.md
CHANGED
|
@@ -397,7 +397,7 @@ JSONTypes.get<string>(someJson, 'a', 'b', 1, 'c') // miku
|
|
|
397
397
|
- `IsRecord<T>`: `logical` predicate for `Record`.
|
|
398
398
|
- `KeysWithDiffTypes<A, B>`: gets the keys common in `A` and `B` but with different value type.
|
|
399
399
|
- `mapKey()`: type adjusted map by key.
|
|
400
|
-
- `
|
|
400
|
+
- `reduceByKey()`: type adjusted reduce by key.
|
|
401
401
|
- `someKey()`: type adjusted some by key.
|
|
402
402
|
- `SpreadRecord<A, B>`: type for `{...a, ...b}` when both `a` and `b` are `Record`. \
|
|
403
403
|
for array, just do `[...A, ...B]`.
|
|
@@ -489,10 +489,11 @@ So you may encounter some weird behavior if your logic is complex.
|
|
|
489
489
|
- `hasProperty(value, prop)`: assert `value` has property `prop`. This will pick the correct union type.
|
|
490
490
|
- `isConstructor(subject)`: type guard `subject` is a constructor.
|
|
491
491
|
- `isSystemError(code, err)`: type guard `err` with Nodejs error code.
|
|
492
|
-
- `pick(obj, ...props)`: pick properties from `obj`.
|
|
493
492
|
- `omit(obj, ...props)`: omit properties from `obj`.
|
|
493
|
+
- `pick(obj, ...props)`: pick properties from `obj`.
|
|
494
494
|
- `required(...)`: merge options and removing `Partial<T>`. From [`unpartial`](https://github.com/unional/unpartial)
|
|
495
495
|
- `requiredDeep(...)`: merge options deeply and removing `Partial<T>`. From [`unpartial`](https://github.com/unional/unpartial)
|
|
496
|
+
- `split(target, ...splitters)`: split one object into multiple objects.
|
|
496
497
|
- `typeOverrideIncompatible<T>()`: override only the incompatible portion between two types.
|
|
497
498
|
|
|
498
499
|
```ts
|
package/cjs/object/index.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export * from './mapKey';
|
|
|
19
19
|
export * from './mapProperties';
|
|
20
20
|
export * from './omit';
|
|
21
21
|
export type { OptionalKeys } from './OptionalKeys';
|
|
22
|
-
export type { PartialOmit, PartialPick
|
|
22
|
+
export type { PartialExcept, PartialOmit, PartialPick } from './Partial';
|
|
23
23
|
export * from './pick';
|
|
24
24
|
export type { RecursiveIntersect } from './RecursiveIntersect';
|
|
25
25
|
export type { RecursivePartial } from './RecursivePartial';
|
|
@@ -29,6 +29,7 @@ export * from './replaceProperty';
|
|
|
29
29
|
export type { RequiredExcept, RequiredPick } from './Required';
|
|
30
30
|
export type { RequiredKeys } from './RequiredKeys';
|
|
31
31
|
export * from './someKey';
|
|
32
|
+
export * from './split';
|
|
32
33
|
export type { SpreadRecord } from './SpreadRecord';
|
|
33
34
|
export * from './typeOverrideIncompatible';
|
|
34
35
|
export type { ValueOf } from './ValueOf';
|
package/cjs/object/index.js
CHANGED
|
@@ -29,5 +29,6 @@ __exportStar(require("./pick"), exports);
|
|
|
29
29
|
__exportStar(require("./reduceKey"), exports);
|
|
30
30
|
__exportStar(require("./replaceProperty"), exports);
|
|
31
31
|
__exportStar(require("./someKey"), exports);
|
|
32
|
+
__exportStar(require("./split"), exports);
|
|
32
33
|
__exportStar(require("./typeOverrideIncompatible"), exports);
|
|
33
34
|
//# sourceMappingURL=index.js.map
|
package/cjs/object/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/object/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAEA,6CAA0B;AAE1B,2CAAwB;AACxB,8CAA2B;AAC3B,4CAAyB;AACzB,+CAA4B;AAC5B,6CAA0B;AAC1B,2CAAwB;AACxB,gDAA6B;AAO7B,2CAAwB;AACxB,kDAA+B;AAC/B,yCAAsB;AAGtB,yCAAsB;AAItB,8CAA2B;AAC3B,oDAAiC;AAGjC,4CAAyB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/object/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAEA,6CAA0B;AAE1B,2CAAwB;AACxB,8CAA2B;AAC3B,4CAAyB;AACzB,+CAA4B;AAC5B,6CAA0B;AAC1B,2CAAwB;AACxB,gDAA6B;AAO7B,2CAAwB;AACxB,kDAA+B;AAC/B,yCAAsB;AAGtB,yCAAsB;AAItB,8CAA2B;AAC3B,oDAAiC;AAGjC,4CAAyB;AACzB,0CAAuB;AAEvB,6DAA0C"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { AnyRecord, Omit } from '..';
|
|
2
|
+
declare type Splitter<T extends AnyRecord> = Partial<{
|
|
3
|
+
[k in keyof T]: T[k] | undefined;
|
|
4
|
+
}>;
|
|
5
|
+
declare type Split<T extends AnyRecord, S extends AnyRecord> = {
|
|
6
|
+
[k in keyof S]: NonNullable<T[k]> | S[k];
|
|
7
|
+
};
|
|
8
|
+
export declare function split<T extends AnyRecord, S1 extends Splitter<T>>(target: T, split1: S1): [
|
|
9
|
+
Split<T, S1>,
|
|
10
|
+
Omit<T, keyof S1>
|
|
11
|
+
];
|
|
12
|
+
export declare function split<T extends AnyRecord, S1 extends Splitter<T>, S2 extends Splitter<T>>(target: T, split1: S1, split2: S2): [
|
|
13
|
+
Split<T, S1>,
|
|
14
|
+
Split<T, S2>,
|
|
15
|
+
Omit<T, keyof S1 | keyof S2>
|
|
16
|
+
];
|
|
17
|
+
export declare function split<T extends AnyRecord, S1 extends Splitter<T>, S2 extends Splitter<T>, S3 extends Splitter<T>>(target: T, splitter1: S1, splitter2: S2, splitter3: S3): [
|
|
18
|
+
Split<T, S1>,
|
|
19
|
+
Split<T, S2>,
|
|
20
|
+
Split<T, S3>,
|
|
21
|
+
Omit<T, keyof S1 | keyof S2 | keyof S3>
|
|
22
|
+
];
|
|
23
|
+
export declare function split<T extends AnyRecord, S1 extends Splitter<T>, S2 extends Splitter<T>, S3 extends Splitter<T>, S4 extends Splitter<T>>(target: T, splitter1: S1, splitter2: S2, splitter3: S3, splitter4: S4): [
|
|
24
|
+
Split<T, S1>,
|
|
25
|
+
Split<T, S2>,
|
|
26
|
+
Split<T, S3>,
|
|
27
|
+
Split<T, S4>,
|
|
28
|
+
Omit<T, keyof S1 | keyof S2 | keyof S3 | keyof S4>
|
|
29
|
+
];
|
|
30
|
+
export declare function split<T extends AnyRecord, S1 extends Splitter<T>, S2 extends Splitter<T>, S3 extends Splitter<T>, S4 extends Splitter<T>, S5 extends Splitter<T>>(target: T, splitter1: S1, splitter2: S2, splitter3: S3, splitter4: S4, splitter5: S5): [
|
|
31
|
+
Split<T, S1>,
|
|
32
|
+
Split<T, S2>,
|
|
33
|
+
Split<T, S3>,
|
|
34
|
+
Split<T, S4>,
|
|
35
|
+
Split<T, S5>,
|
|
36
|
+
Omit<T, keyof S1 | keyof S2 | keyof S3 | keyof S4 | keyof S5>
|
|
37
|
+
];
|
|
38
|
+
export declare function split<T extends AnyRecord, S1 extends Splitter<T>, S2 extends Splitter<T>, S3 extends Splitter<T>, S4 extends Splitter<T>, S5 extends Splitter<T>, S6 extends Splitter<T>>(target: T, splitter1: S1, splitter2: S2, splitter3: S3, splitter4: S4, splitter5: S5, splitter6: S6): [
|
|
39
|
+
Split<T, S1>,
|
|
40
|
+
Split<T, S2>,
|
|
41
|
+
Split<T, S3>,
|
|
42
|
+
Split<T, S4>,
|
|
43
|
+
Split<T, S5>,
|
|
44
|
+
Split<T, S6>,
|
|
45
|
+
Omit<T, keyof S1 | keyof S2 | keyof S3 | keyof S4 | keyof S5 | keyof S6>
|
|
46
|
+
];
|
|
47
|
+
export declare function split<T extends AnyRecord, S1 extends Splitter<T>, S2 extends Splitter<T>, S3 extends Splitter<T>, S4 extends Splitter<T>, S5 extends Splitter<T>, S6 extends Splitter<T>, S7 extends Splitter<T>>(target: T, splitter1: S1, splitter2: S2, splitter3: S3, splitter4: S4, splitter5: S5, splitter6: S6, splitter7: S7): [
|
|
48
|
+
Split<T, S1>,
|
|
49
|
+
Split<T, S2>,
|
|
50
|
+
Split<T, S3>,
|
|
51
|
+
Split<T, S4>,
|
|
52
|
+
Split<T, S5>,
|
|
53
|
+
Split<T, S6>,
|
|
54
|
+
Split<T, S7>,
|
|
55
|
+
Omit<T, keyof S1 | keyof S2 | keyof S3 | keyof S4 | keyof S5 | keyof S6 | keyof S7>
|
|
56
|
+
];
|
|
57
|
+
export declare function split<T extends AnyRecord, S1 extends Splitter<T>, S2 extends Splitter<T>, S3 extends Splitter<T>, S4 extends Splitter<T>, S5 extends Splitter<T>, S6 extends Splitter<T>, S7 extends Splitter<T>, S8 extends Splitter<T>>(target: T, splitter1: S1, splitter2: S2, splitter3: S3, splitter4: S4, splitter5: S5, splitter6: S6, splitter7: S7, splitter8: S8): [
|
|
58
|
+
Split<T, S1>,
|
|
59
|
+
Split<T, S2>,
|
|
60
|
+
Split<T, S3>,
|
|
61
|
+
Split<T, S4>,
|
|
62
|
+
Split<T, S5>,
|
|
63
|
+
Split<T, S6>,
|
|
64
|
+
Split<T, S7>,
|
|
65
|
+
Split<T, S8>,
|
|
66
|
+
Omit<T, keyof S1 | keyof S2 | keyof S3 | keyof S4 | keyof S5 | keyof S6 | keyof S7 | keyof S8>
|
|
67
|
+
];
|
|
68
|
+
export declare function split<T extends AnyRecord, S1 extends Splitter<T>, S2 extends Splitter<T>, S3 extends Splitter<T>, S4 extends Splitter<T>, S5 extends Splitter<T>, S6 extends Splitter<T>, S7 extends Splitter<T>, S8 extends Splitter<T>, S9 extends Splitter<T>>(target: T, splitter1: S1, splitter2: S2, splitter3: S3, splitter4: S4, splitter5: S5, splitter6: S6, splitter7: S7, splitter8: S8, splitter9: S9): [
|
|
69
|
+
Split<T, S1>,
|
|
70
|
+
Split<T, S2>,
|
|
71
|
+
Split<T, S3>,
|
|
72
|
+
Split<T, S4>,
|
|
73
|
+
Split<T, S5>,
|
|
74
|
+
Split<T, S6>,
|
|
75
|
+
Split<T, S7>,
|
|
76
|
+
Split<T, S8>,
|
|
77
|
+
Split<T, S9>,
|
|
78
|
+
Omit<T, keyof S1 | keyof S2 | keyof S3 | keyof S4 | keyof S5 | keyof S6 | keyof S7 | keyof S8 | keyof S9>
|
|
79
|
+
];
|
|
80
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
3
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
4
|
+
if (ar || !(i in from)) {
|
|
5
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
6
|
+
ar[i] = from[i];
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.split = void 0;
|
|
13
|
+
var __1 = require("..");
|
|
14
|
+
function split(target) {
|
|
15
|
+
var splitters = [];
|
|
16
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
17
|
+
splitters[_i - 1] = arguments[_i];
|
|
18
|
+
}
|
|
19
|
+
var keyMap = {};
|
|
20
|
+
var s = splitters.map(function (s) { return (0, __1.reduceByKey)(s, function (p, k) { var _a; return (keyMap[k] = true, p[k] = (_a = target[k]) !== null && _a !== void 0 ? _a : s[k], p); }, {}); });
|
|
21
|
+
var r = (0, __1.reduceByKey)(target, function (p, k) { return keyMap[k] ? p : (p[k] = target[k], p); }, {});
|
|
22
|
+
return __spreadArray(__spreadArray([], s, true), [r], false);
|
|
23
|
+
}
|
|
24
|
+
exports.split = split;
|
|
25
|
+
//# sourceMappingURL=split.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"split.js","sourceRoot":"","sources":["../../ts/object/split.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wBAAiD;AAyLjD,SAAgB,KAAK,CAAC,MAAiB;IAAE,mBAAyB;SAAzB,UAAyB,EAAzB,qBAAyB,EAAzB,IAAyB;QAAzB,kCAAyB;;IAChE,IAAM,MAAM,GAAc,EAAE,CAAA;IAC5B,IAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,IAAA,eAAW,EAAC,CAAC,EAAE,UAAC,CAAC,EAAE,CAAC,YAAK,OAAA,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAA,MAAM,CAAC,CAAC,CAAC,mCAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,EAAA,EAAE,EAAe,CAAC,EAA1F,CAA0F,CAAC,CAAA;IACxH,IAAM,CAAC,GAAG,IAAA,eAAW,EAAC,MAAM,EAAE,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAArC,CAAqC,EAAE,EAAe,CAAC,CAAA;IAC/F,uCAAW,CAAC,UAAE,CAAC,UAAC;AAClB,CAAC;AALD,sBAKC"}
|
package/esm/object/index.js
CHANGED
package/esm/object/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/object/index.ts"],"names":[],"mappings":"AAEA,cAAc,YAAY,CAAA;AAE1B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,eAAe,CAAA;AAO7B,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,QAAQ,CAAA;AAGtB,cAAc,QAAQ,CAAA;AAItB,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AAGjC,cAAc,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/object/index.ts"],"names":[],"mappings":"AAEA,cAAc,YAAY,CAAA;AAE1B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,eAAe,CAAA;AAO7B,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,QAAQ,CAAA;AAGtB,cAAc,QAAQ,CAAA;AAItB,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AAGjC,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AAEvB,cAAc,4BAA4B,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { reduceByKey } from '..';
|
|
2
|
+
export function split(target, ...splitters) {
|
|
3
|
+
const keyMap = {};
|
|
4
|
+
const s = splitters.map(s => reduceByKey(s, (p, k) => (keyMap[k] = true, p[k] = target[k] ?? s[k], p), {}));
|
|
5
|
+
const r = reduceByKey(target, (p, k) => keyMap[k] ? p : (p[k] = target[k], p), {});
|
|
6
|
+
return [...s, r];
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=split.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"split.js","sourceRoot":"","sources":["../../ts/object/split.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,WAAW,EAAE,MAAM,IAAI,CAAA;AAyLjD,MAAM,UAAU,KAAK,CAAC,MAAiB,EAAE,GAAG,SAAsB;IAChE,MAAM,MAAM,GAAc,EAAE,CAAA;IAC5B,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAe,CAAC,CAAC,CAAA;IACxH,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAe,CAAC,CAAA;IAC/F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;AAClB,CAAC"}
|
package/package.json
CHANGED
package/ts/object/index.ts
CHANGED
|
@@ -19,7 +19,7 @@ export * from './mapKey'
|
|
|
19
19
|
export * from './mapProperties'
|
|
20
20
|
export * from './omit'
|
|
21
21
|
export type { OptionalKeys } from './OptionalKeys'
|
|
22
|
-
export type { PartialOmit, PartialPick
|
|
22
|
+
export type { PartialExcept, PartialOmit, PartialPick } from './Partial'
|
|
23
23
|
export * from './pick'
|
|
24
24
|
export type { RecursiveIntersect } from './RecursiveIntersect'
|
|
25
25
|
export type { RecursivePartial } from './RecursivePartial'
|
|
@@ -29,7 +29,7 @@ export * from './replaceProperty'
|
|
|
29
29
|
export type { RequiredExcept, RequiredPick } from './Required'
|
|
30
30
|
export type { RequiredKeys } from './RequiredKeys'
|
|
31
31
|
export * from './someKey'
|
|
32
|
+
export * from './split'
|
|
32
33
|
export type { SpreadRecord } from './SpreadRecord'
|
|
33
34
|
export * from './typeOverrideIncompatible'
|
|
34
35
|
export type { ValueOf } from './ValueOf'
|
|
35
|
-
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { isType, split } from '..'
|
|
2
|
+
|
|
3
|
+
const target = { a: 0, b: '', c: false }
|
|
4
|
+
test('can use undefined as default', () => {
|
|
5
|
+
const [{ a }] = split(target, { a: undefined })
|
|
6
|
+
|
|
7
|
+
isType.equal<true, typeof a, number | undefined>()
|
|
8
|
+
expect(a).toBe(0)
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
test('can specify default with the same type', () => {
|
|
12
|
+
const [{ a }] = split(target, { a: 2 })
|
|
13
|
+
|
|
14
|
+
isType.equal<true, typeof a, number>()
|
|
15
|
+
expect(a).toBe(0)
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
test('can specify default as one of the intersect types', () => {
|
|
19
|
+
const [a] = split({ a: undefined as number | string | undefined }, { a: '2' })
|
|
20
|
+
|
|
21
|
+
isType.equal<true, typeof a, { a: number | string }>()
|
|
22
|
+
expect(a).toEqual({ a: '2' })
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
test('get remaining props in the last entry', () => {
|
|
26
|
+
const [, r] = split(target, { a: undefined })
|
|
27
|
+
|
|
28
|
+
isType.equal<true, typeof r, { b: string, c: boolean }>()
|
|
29
|
+
expect(r).toEqual({ b: '', c: false })
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
test('work with simple Record', () => {
|
|
33
|
+
const [a] = split({} as Record<string, string>, { a: 'a' })
|
|
34
|
+
|
|
35
|
+
isType.equal<true, typeof a, { a: string }>()
|
|
36
|
+
expect(a).toEqual({ a: 'a' })
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
test('can specify multiple splitters', () => {
|
|
40
|
+
const t = { r: 'r' } as { a?: string, b?: string, c?: string, r?: string }
|
|
41
|
+
const [a, b, c, r] = split(t,
|
|
42
|
+
{ a: 'a' },
|
|
43
|
+
{ b: 'b' },
|
|
44
|
+
{ c: 'c' }
|
|
45
|
+
)
|
|
46
|
+
isType.equal<true, typeof a, { a: string }>()
|
|
47
|
+
isType.equal<true, typeof b, { b: string }>()
|
|
48
|
+
isType.equal<true, typeof c, { c: string }>()
|
|
49
|
+
isType.equal<true, typeof r, { r?: string | undefined }>()
|
|
50
|
+
expect(a).toEqual({ a: 'a' })
|
|
51
|
+
expect(b).toEqual({ b: 'b' })
|
|
52
|
+
expect(c).toEqual({ c: 'c' })
|
|
53
|
+
expect(r).toEqual({ r: 'r' })
|
|
54
|
+
})
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { AnyRecord, Omit, reduceByKey } from '..'
|
|
2
|
+
|
|
3
|
+
type Splitter<T extends AnyRecord> = Partial<{ [k in keyof T]: T[k] | undefined }>
|
|
4
|
+
type Split<T extends AnyRecord, S extends AnyRecord> = { [k in keyof S]: NonNullable<T[k]> | S[k] }
|
|
5
|
+
|
|
6
|
+
export function split<
|
|
7
|
+
T extends AnyRecord,
|
|
8
|
+
S1 extends Splitter<T>
|
|
9
|
+
>(target: T, split1: S1): [
|
|
10
|
+
Split<T, S1>,
|
|
11
|
+
Omit<T, keyof S1>
|
|
12
|
+
]
|
|
13
|
+
export function split<
|
|
14
|
+
T extends AnyRecord,
|
|
15
|
+
S1 extends Splitter<T>,
|
|
16
|
+
S2 extends Splitter<T>,
|
|
17
|
+
>(target: T, split1: S1, split2: S2): [
|
|
18
|
+
Split<T, S1>,
|
|
19
|
+
Split<T, S2>,
|
|
20
|
+
Omit<T, keyof S1 | keyof S2>
|
|
21
|
+
]
|
|
22
|
+
export function split<
|
|
23
|
+
T extends AnyRecord,
|
|
24
|
+
S1 extends Splitter<T>,
|
|
25
|
+
S2 extends Splitter<T>,
|
|
26
|
+
S3 extends Splitter<T>,
|
|
27
|
+
>(target: T, splitter1: S1, splitter2: S2, splitter3: S3): [
|
|
28
|
+
Split<T, S1>,
|
|
29
|
+
Split<T, S2>,
|
|
30
|
+
Split<T, S3>,
|
|
31
|
+
Omit<T, keyof S1 | keyof S2 | keyof S3>
|
|
32
|
+
]
|
|
33
|
+
export function split<
|
|
34
|
+
T extends AnyRecord,
|
|
35
|
+
S1 extends Splitter<T>,
|
|
36
|
+
S2 extends Splitter<T>,
|
|
37
|
+
S3 extends Splitter<T>,
|
|
38
|
+
S4 extends Splitter<T>,
|
|
39
|
+
>(target: T,
|
|
40
|
+
splitter1: S1,
|
|
41
|
+
splitter2: S2,
|
|
42
|
+
splitter3: S3,
|
|
43
|
+
splitter4: S4,
|
|
44
|
+
): [
|
|
45
|
+
Split<T, S1>,
|
|
46
|
+
Split<T, S2>,
|
|
47
|
+
Split<T, S3>,
|
|
48
|
+
Split<T, S4>,
|
|
49
|
+
Omit<T, keyof S1 | keyof S2 | keyof S3 | keyof S4>
|
|
50
|
+
]
|
|
51
|
+
export function split<
|
|
52
|
+
T extends AnyRecord,
|
|
53
|
+
S1 extends Splitter<T>,
|
|
54
|
+
S2 extends Splitter<T>,
|
|
55
|
+
S3 extends Splitter<T>,
|
|
56
|
+
S4 extends Splitter<T>,
|
|
57
|
+
S5 extends Splitter<T>,
|
|
58
|
+
>(target: T,
|
|
59
|
+
splitter1: S1,
|
|
60
|
+
splitter2: S2,
|
|
61
|
+
splitter3: S3,
|
|
62
|
+
splitter4: S4,
|
|
63
|
+
splitter5: S5,
|
|
64
|
+
): [
|
|
65
|
+
Split<T, S1>,
|
|
66
|
+
Split<T, S2>,
|
|
67
|
+
Split<T, S3>,
|
|
68
|
+
Split<T, S4>,
|
|
69
|
+
Split<T, S5>,
|
|
70
|
+
Omit<T, keyof S1 | keyof S2 | keyof S3 | keyof S4 | keyof S5>
|
|
71
|
+
]
|
|
72
|
+
export function split<
|
|
73
|
+
T extends AnyRecord,
|
|
74
|
+
S1 extends Splitter<T>,
|
|
75
|
+
S2 extends Splitter<T>,
|
|
76
|
+
S3 extends Splitter<T>,
|
|
77
|
+
S4 extends Splitter<T>,
|
|
78
|
+
S5 extends Splitter<T>,
|
|
79
|
+
S6 extends Splitter<T>,
|
|
80
|
+
>(target: T,
|
|
81
|
+
splitter1: S1,
|
|
82
|
+
splitter2: S2,
|
|
83
|
+
splitter3: S3,
|
|
84
|
+
splitter4: S4,
|
|
85
|
+
splitter5: S5,
|
|
86
|
+
splitter6: S6,
|
|
87
|
+
): [
|
|
88
|
+
Split<T, S1>,
|
|
89
|
+
Split<T, S2>,
|
|
90
|
+
Split<T, S3>,
|
|
91
|
+
Split<T, S4>,
|
|
92
|
+
Split<T, S5>,
|
|
93
|
+
Split<T, S6>,
|
|
94
|
+
Omit<T, keyof S1 | keyof S2 | keyof S3 | keyof S4 | keyof S5 | keyof S6>
|
|
95
|
+
]
|
|
96
|
+
export function split<
|
|
97
|
+
T extends AnyRecord,
|
|
98
|
+
S1 extends Splitter<T>,
|
|
99
|
+
S2 extends Splitter<T>,
|
|
100
|
+
S3 extends Splitter<T>,
|
|
101
|
+
S4 extends Splitter<T>,
|
|
102
|
+
S5 extends Splitter<T>,
|
|
103
|
+
S6 extends Splitter<T>,
|
|
104
|
+
S7 extends Splitter<T>,
|
|
105
|
+
>(target: T,
|
|
106
|
+
splitter1: S1,
|
|
107
|
+
splitter2: S2,
|
|
108
|
+
splitter3: S3,
|
|
109
|
+
splitter4: S4,
|
|
110
|
+
splitter5: S5,
|
|
111
|
+
splitter6: S6,
|
|
112
|
+
splitter7: S7,
|
|
113
|
+
): [
|
|
114
|
+
Split<T, S1>,
|
|
115
|
+
Split<T, S2>,
|
|
116
|
+
Split<T, S3>,
|
|
117
|
+
Split<T, S4>,
|
|
118
|
+
Split<T, S5>,
|
|
119
|
+
Split<T, S6>,
|
|
120
|
+
Split<T, S7>,
|
|
121
|
+
Omit<T, keyof S1 | keyof S2 | keyof S3 | keyof S4 | keyof S5 | keyof S6 | keyof S7>
|
|
122
|
+
]
|
|
123
|
+
export function split<
|
|
124
|
+
T extends AnyRecord,
|
|
125
|
+
S1 extends Splitter<T>,
|
|
126
|
+
S2 extends Splitter<T>,
|
|
127
|
+
S3 extends Splitter<T>,
|
|
128
|
+
S4 extends Splitter<T>,
|
|
129
|
+
S5 extends Splitter<T>,
|
|
130
|
+
S6 extends Splitter<T>,
|
|
131
|
+
S7 extends Splitter<T>,
|
|
132
|
+
S8 extends Splitter<T>,
|
|
133
|
+
>(target: T,
|
|
134
|
+
splitter1: S1,
|
|
135
|
+
splitter2: S2,
|
|
136
|
+
splitter3: S3,
|
|
137
|
+
splitter4: S4,
|
|
138
|
+
splitter5: S5,
|
|
139
|
+
splitter6: S6,
|
|
140
|
+
splitter7: S7,
|
|
141
|
+
splitter8: S8,
|
|
142
|
+
): [
|
|
143
|
+
Split<T, S1>,
|
|
144
|
+
Split<T, S2>,
|
|
145
|
+
Split<T, S3>,
|
|
146
|
+
Split<T, S4>,
|
|
147
|
+
Split<T, S5>,
|
|
148
|
+
Split<T, S6>,
|
|
149
|
+
Split<T, S7>,
|
|
150
|
+
Split<T, S8>,
|
|
151
|
+
Omit<T, keyof S1 | keyof S2 | keyof S3 | keyof S4 | keyof S5 | keyof S6 | keyof S7 | keyof S8>
|
|
152
|
+
]
|
|
153
|
+
export function split<
|
|
154
|
+
T extends AnyRecord,
|
|
155
|
+
S1 extends Splitter<T>,
|
|
156
|
+
S2 extends Splitter<T>,
|
|
157
|
+
S3 extends Splitter<T>,
|
|
158
|
+
S4 extends Splitter<T>,
|
|
159
|
+
S5 extends Splitter<T>,
|
|
160
|
+
S6 extends Splitter<T>,
|
|
161
|
+
S7 extends Splitter<T>,
|
|
162
|
+
S8 extends Splitter<T>,
|
|
163
|
+
S9 extends Splitter<T>,
|
|
164
|
+
>(target: T,
|
|
165
|
+
splitter1: S1,
|
|
166
|
+
splitter2: S2,
|
|
167
|
+
splitter3: S3,
|
|
168
|
+
splitter4: S4,
|
|
169
|
+
splitter5: S5,
|
|
170
|
+
splitter6: S6,
|
|
171
|
+
splitter7: S7,
|
|
172
|
+
splitter8: S8,
|
|
173
|
+
splitter9: S9,
|
|
174
|
+
): [
|
|
175
|
+
Split<T, S1>,
|
|
176
|
+
Split<T, S2>,
|
|
177
|
+
Split<T, S3>,
|
|
178
|
+
Split<T, S4>,
|
|
179
|
+
Split<T, S5>,
|
|
180
|
+
Split<T, S6>,
|
|
181
|
+
Split<T, S7>,
|
|
182
|
+
Split<T, S8>,
|
|
183
|
+
Split<T, S9>,
|
|
184
|
+
Omit<T, keyof S1 | keyof S2 | keyof S3 | keyof S4 | keyof S5 | keyof S6 | keyof S7 | keyof S8 | keyof S9>
|
|
185
|
+
]
|
|
186
|
+
export function split(target: AnyRecord, ...splitters: AnyRecord[]): AnyRecord[] {
|
|
187
|
+
const keyMap: AnyRecord = {}
|
|
188
|
+
const s = splitters.map(s => reduceByKey(s, (p, k) => (keyMap[k] = true, p[k] = target[k] ?? s[k], p), {} as AnyRecord))
|
|
189
|
+
const r = reduceByKey(target, (p, k) => keyMap[k] ? p : (p[k] = target[k], p), {} as AnyRecord)
|
|
190
|
+
return [...s, r]
|
|
191
|
+
}
|