Implement a mechanism to overload kcContext
This commit is contained in:
35
src/lib/tools/AndByDiscriminatingKey.d.ts
vendored
Normal file
35
src/lib/tools/AndByDiscriminatingKey.d.ts
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
|
||||
export type AndByDiscriminatingKey<
|
||||
DiscriminatingKey extends string,
|
||||
U1 extends Record<DiscriminatingKey, string>,
|
||||
U2 extends Record<DiscriminatingKey, string>
|
||||
> =
|
||||
AndByDiscriminatingKey.Tf1<DiscriminatingKey, U1, U1, U2>;
|
||||
|
||||
export declare namespace AndByDiscriminatingKey {
|
||||
|
||||
export type Tf1<
|
||||
DiscriminatingKey extends string,
|
||||
U1,
|
||||
U1Again extends Record<DiscriminatingKey, string>,
|
||||
U2 extends Record<DiscriminatingKey, string>
|
||||
> =
|
||||
U1 extends Pick<U2, DiscriminatingKey> ?
|
||||
Tf2<DiscriminatingKey, U1, U2, U1Again> :
|
||||
U1;
|
||||
|
||||
export type Tf2<
|
||||
DiscriminatingKey extends string,
|
||||
SingletonU1 extends Record<DiscriminatingKey, string>,
|
||||
U2,
|
||||
U1 extends Record<DiscriminatingKey, string>
|
||||
> =
|
||||
U2 extends Pick<SingletonU1, DiscriminatingKey> ?
|
||||
U2 & SingletonU1 :
|
||||
U2 extends Pick<U1, DiscriminatingKey> ?
|
||||
never :
|
||||
U2;
|
||||
|
||||
}
|
||||
|
||||
|
4
src/lib/tools/DeepPartial.d.ts
vendored
Normal file
4
src/lib/tools/DeepPartial.d.ts
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
export type DeepPartial<T> = {
|
||||
[P in keyof T]?: DeepPartial<T[P]>;
|
||||
};
|
@ -1,2 +1,2 @@
|
||||
|
||||
export { assert } from "evt/tools/typeSafety/assert";
|
||||
export { assert } from "tsafe/assert";
|
56
src/lib/tools/deepAssign.ts
Normal file
56
src/lib/tools/deepAssign.ts
Normal file
@ -0,0 +1,56 @@
|
||||
|
||||
import { assert } from "tsafe/assert";
|
||||
import { is } from "tsafe/is";
|
||||
|
||||
export function deepAssign(
|
||||
params: {
|
||||
target: Record<string, unknown>;
|
||||
source: Record<string, unknown>;
|
||||
}
|
||||
) {
|
||||
|
||||
const { target, source } = params;
|
||||
|
||||
Object.keys(source).forEach(key => {
|
||||
var dereferencedSource = source[key];
|
||||
|
||||
if (
|
||||
target[key] === undefined ||
|
||||
!(dereferencedSource instanceof Object)
|
||||
) {
|
||||
|
||||
Object.defineProperty(
|
||||
target,
|
||||
key,
|
||||
{
|
||||
"enumerable": true,
|
||||
"value": dereferencedSource
|
||||
}
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const dereferencedTarget = target[key];
|
||||
|
||||
if (dereferencedSource instanceof Array) {
|
||||
|
||||
assert(is<unknown[]>(dereferencedTarget));
|
||||
assert(is<unknown[]>(dereferencedSource));
|
||||
|
||||
dereferencedSource.forEach(entry => dereferencedTarget.push(entry));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
assert(is<Record<string, unknown>>(dereferencedTarget));
|
||||
assert(is<Record<string, unknown>>(dereferencedSource));
|
||||
|
||||
deepAssign({
|
||||
"target": dereferencedTarget,
|
||||
"source": dereferencedSource
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
}
|
4
src/lib/tools/deepClone.ts
Normal file
4
src/lib/tools/deepClone.ts
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
export function deepClone<T>(arg: T): T {
|
||||
return JSON.parse(JSON.stringify(arg));
|
||||
}
|
Reference in New Issue
Block a user