Small Nest.js-based project
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
test-assignment-joyn/src/utils/objectHelpers.ts

50 lines
1.3 KiB

export const identity = <T>(value: T) => value;
export const createTargetHelpers = <TTarget>(
missingValueIndicators: unknown[],
) => {
const createRequiredField = <
TKey extends string & keyof TTarget,
TRawValue,
>(
key: TKey,
value: TRawValue,
transformer: (value: TRawValue) => TTarget[TKey],
) => {
if (value === undefined) {
throw new Error(`Value for ${key} is not defined`);
}
if (missingValueIndicators.includes(value)) {
throw new Error(`Missing value for ${key}`);
}
return {
[key]: transformer(value),
} as Record<TKey, TTarget[TKey]>;
};
const createOptionalField = <
TKey extends string & keyof TTarget,
TRawValue,
>(
key: TKey,
value: TRawValue,
transformer: (value: Exclude<TRawValue, undefined>) => TTarget[TKey],
) => {
if (value === undefined || missingValueIndicators.includes(value)) {
return undefined;
}
return createRequiredField(
key,
value as Exclude<TRawValue, undefined>,
transformer,
);
};
return {
createRequiredField,
createOptionalField,
};
};