diff --git a/src/immutable.ts b/src/immutable.ts new file mode 100644 index 000000000..4acf1a5b9 --- /dev/null +++ b/src/immutable.ts @@ -0,0 +1,38 @@ +/** Imported from Immer to avoid having an implicit dependency in this patch */ +type PrimitiveType = number | string | boolean +type AtomicObject = Function | Promise | Date | RegExp +export type IfAvailable = + // fallback if any + true | false extends (T extends never ? true : false) + ? Fallback // fallback if empty type + : keyof T extends never + ? Fallback // original type + : T +type WeakReferences = IfAvailable> | IfAvailable> +export type WritableDraft = { -readonly [K in keyof T]: Draft } +export type Draft = T extends PrimitiveType + ? T + : T extends AtomicObject + ? T + : T extends IfAvailable> // Map extends ReadonlyMap + ? Map, Draft> + : T extends IfAvailable> // Set extends ReadonlySet + ? Set> + : T extends WeakReferences + ? T + : T extends object + ? WritableDraft + : T +export type Immutable = T extends PrimitiveType + ? T + : T extends AtomicObject + ? T + : T extends IfAvailable> // Map extends ReadonlyMap + ? ReadonlyMap, Immutable> + : T extends IfAvailable> // Set extends ReadonlySet + ? ReadonlySet> + : T extends WeakReferences + ? T + : T extends object + ? { readonly [K in keyof T]: Immutable } + : T diff --git a/src/index.ts b/src/index.ts index a231decc9..9281350c1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,7 +9,8 @@ import type { Expand, ObjValueTuple, Head, - Tail + Tail, + Immutable } from './types' export type { @@ -171,11 +172,11 @@ export interface CreateSelectorFunction< ( ...items: [ ...Selectors, - (...args: SelectorResultArray) => Result + (...args: SelectorResultArray) => Immutable ] ): OutputSelector< Selectors, - Result, + Immutable, (...args: SelectorResultArray) => Result, GetParamsFromSelectors, Keys @@ -191,8 +192,8 @@ export interface CreateSelectorFunction< ] ): OutputSelector< Selectors, - Result, - ((...args: SelectorResultArray) => Result), + Immutable, + (...args: SelectorResultArray) => Result, GetParamsFromSelectors, Keys > & @@ -201,11 +202,11 @@ export interface CreateSelectorFunction< /** Input selectors as a separate array */ ( selectors: [...Selectors], - combiner: (...args: SelectorResultArray) => Result, + combiner: (...args: SelectorResultArray) => Immutable, options?: CreateSelectorOptions ): OutputSelector< Selectors, - Result, + Immutable, (...args: SelectorResultArray) => Result, GetParamsFromSelectors, Keys diff --git a/src/types.ts b/src/types.ts index 9a117f8b3..f896f8a29 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,5 +1,6 @@ import type { MergeParameters } from './versionedTypes' export type { MergeParameters } from './versionedTypes' +export type { Immutable } from './immutable' /* *