Skip to content

Commit

Permalink
implement Merge type
Browse files Browse the repository at this point in the history
  • Loading branch information
razvan-dumi committed May 25, 2024
1 parent bb90f92 commit f2c0fc3
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 8 deletions.
13 changes: 5 additions & 8 deletions src/redux/features/api.types.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
import { Merge } from '../../utils/helpers';

export namespace Evaluation {
export type CorrectFragmentData = {
op: 'nochange';
word: string;
replace?: undefined;
indicator?: undefined;
feedback?: undefined;
};

export type SingleFragmentData = {
op: 'addition' | 'deletion';
word: string;
replace?: undefined;
indicator: string;
feedback: string;
};
Expand All @@ -23,10 +21,9 @@ export namespace Evaluation {
feedback: string;
};

export type SentenceFragmentData =
| CorrectFragmentData
| SingleFragmentData
| DoubleFragmentData;
export type SentenceFragmentData = Merge<
[CorrectFragmentData, SingleFragmentData, DoubleFragmentData]
>;

export type SentenceData = SentenceFragmentData[];

Expand Down
25 changes: 25 additions & 0 deletions src/utils/helpers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/**
* Extracts the keys of multiple records.
*
* Usage: `Keys<[RecordA, RecordB, RecordC]>`
*/
type Keys<T> = T extends [infer A, ...infer R] ? keyof A | Keys<R> : never;

/**
* Extends `T` to have at least all the keys in `Keys`.
* Everything not already in `T` will be optional and `undefined`.
*/
type Extend<T, Keys extends string | number> = T & {
[K in Exclude<Keys, keyof T>]?: undefined;
};

type MergeInner<T, Keys extends string | number> = T extends [infer A, ...infer R]
? Extend<A, Keys> | MergeInner<R, Keys>
: never;

/**
* Creates a union of multiple records.
* Every record is modified to contain all the keys from all records,
* but 'new' keys will be optional and `undefined`.
*/
export type Merge<T> = MergeInner<T, Keys<T>>;

0 comments on commit f2c0fc3

Please sign in to comment.