From a52dde9da461500e5b503b7835e0bcd1e12f2a06 Mon Sep 17 00:00:00 2001 From: Elliott Kember Date: Fri, 17 Jan 2025 10:34:20 +1300 Subject: [PATCH 1/3] Readonly for createSelector --- src/index.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/index.ts b/src/index.ts index a231decc9..de3aeb2ae 100644 --- a/src/index.ts +++ b/src/index.ts @@ -171,11 +171,11 @@ export interface CreateSelectorFunction< ( ...items: [ ...Selectors, - (...args: SelectorResultArray) => Result + (...args: SelectorResultArray) => Readonly ] ): OutputSelector< Selectors, - Result, + Readonly, (...args: SelectorResultArray) => Result, GetParamsFromSelectors, Keys @@ -191,8 +191,8 @@ export interface CreateSelectorFunction< ] ): OutputSelector< Selectors, - Result, - ((...args: SelectorResultArray) => Result), + Readonly, + ((...args: SelectorResultArray) => Readonly), GetParamsFromSelectors, Keys > & @@ -201,12 +201,12 @@ export interface CreateSelectorFunction< /** Input selectors as a separate array */ ( selectors: [...Selectors], - combiner: (...args: SelectorResultArray) => Result, + combiner: (...args: SelectorResultArray) => Readonly, options?: CreateSelectorOptions ): OutputSelector< Selectors, - Result, - (...args: SelectorResultArray) => Result, + Readonly, + (...args: SelectorResultArray) => Readonly, GetParamsFromSelectors, Keys > & From 1b3d10d9de6450a4d74865d49c91d0c6714811d6 Mon Sep 17 00:00:00 2001 From: Elliott Kember Date: Fri, 17 Jan 2025 11:21:56 +1300 Subject: [PATCH 2/3] Use Immutable from Immer --- src/index.ts | 56 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/src/index.ts b/src/index.ts index de3aeb2ae..5efd51a6a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -31,6 +31,48 @@ import { DefaultMemoizeOptions } from './defaultMemoize' +/** Imported from Immer to avoid having an implicit dependency in this patch */ +type AnyFunc = (...args: any[]) => any +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 + export { defaultMemoize, defaultEqualityCheck } export type { DefaultMemoizeOptions } @@ -171,11 +213,11 @@ export interface CreateSelectorFunction< ( ...items: [ ...Selectors, - (...args: SelectorResultArray) => Readonly + (...args: SelectorResultArray) => Immutable ] ): OutputSelector< Selectors, - Readonly, + Immutable, (...args: SelectorResultArray) => Result, GetParamsFromSelectors, Keys @@ -191,8 +233,8 @@ export interface CreateSelectorFunction< ] ): OutputSelector< Selectors, - Readonly, - ((...args: SelectorResultArray) => Readonly), + Immutable, + (...args: SelectorResultArray) => Result, GetParamsFromSelectors, Keys > & @@ -201,12 +243,12 @@ export interface CreateSelectorFunction< /** Input selectors as a separate array */ ( selectors: [...Selectors], - combiner: (...args: SelectorResultArray) => Readonly, + combiner: (...args: SelectorResultArray) => Immutable, options?: CreateSelectorOptions ): OutputSelector< Selectors, - Readonly, - (...args: SelectorResultArray) => Readonly, + Immutable, + (...args: SelectorResultArray) => Result, GetParamsFromSelectors, Keys > & From 658e1ef2540bc0c3382cf9a411d660a90d6b9013 Mon Sep 17 00:00:00 2001 From: Elliott Kember Date: Fri, 17 Jan 2025 11:24:12 +1300 Subject: [PATCH 3/3] Move immutable type definitions to their own file --- src/immutable.ts | 38 ++++++++++++++++++++++++++++++++++++++ src/index.ts | 45 ++------------------------------------------- src/types.ts | 1 + 3 files changed, 41 insertions(+), 43 deletions(-) create mode 100644 src/immutable.ts 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 5efd51a6a..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 { @@ -31,48 +32,6 @@ import { DefaultMemoizeOptions } from './defaultMemoize' -/** Imported from Immer to avoid having an implicit dependency in this patch */ -type AnyFunc = (...args: any[]) => any -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 - export { defaultMemoize, defaultEqualityCheck } export type { DefaultMemoizeOptions } 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' /* *