Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Immutable selector return types #738

Open
wants to merge 3 commits into
base: 4.x
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions src/immutable.ts
Original file line number Diff line number Diff line change
@@ -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<any> | Date | RegExp
export type IfAvailable<T, Fallback = void> =
// 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<WeakMap<any, any>> | IfAvailable<WeakSet<any>>
export type WritableDraft<T> = { -readonly [K in keyof T]: Draft<T[K]> }
export type Draft<T> = T extends PrimitiveType
? T
: T extends AtomicObject
? T
: T extends IfAvailable<ReadonlyMap<infer K, infer V>> // Map extends ReadonlyMap
? Map<Draft<K>, Draft<V>>
: T extends IfAvailable<ReadonlySet<infer V>> // Set extends ReadonlySet
? Set<Draft<V>>
: T extends WeakReferences
? T
: T extends object
? WritableDraft<T>
: T
export type Immutable<T> = T extends PrimitiveType
? T
: T extends AtomicObject
? T
: T extends IfAvailable<ReadonlyMap<infer K, infer V>> // Map extends ReadonlyMap
? ReadonlyMap<Immutable<K>, Immutable<V>>
: T extends IfAvailable<ReadonlySet<infer V>> // Set extends ReadonlySet
? ReadonlySet<Immutable<V>>
: T extends WeakReferences
? T
: T extends object
? { readonly [K in keyof T]: Immutable<T[K]> }
: T
15 changes: 8 additions & 7 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ import type {
Expand,
ObjValueTuple,
Head,
Tail
Tail,
Immutable
} from './types'

export type {
Expand Down Expand Up @@ -171,11 +172,11 @@ export interface CreateSelectorFunction<
<Selectors extends SelectorArray, Result>(
...items: [
...Selectors,
(...args: SelectorResultArray<Selectors>) => Result
(...args: SelectorResultArray<Selectors>) => Immutable<Result>
]
): OutputSelector<
Selectors,
Result,
Immutable<Result>,
(...args: SelectorResultArray<Selectors>) => Result,
GetParamsFromSelectors<Selectors>,
Keys
Expand All @@ -191,8 +192,8 @@ export interface CreateSelectorFunction<
]
): OutputSelector<
Selectors,
Result,
((...args: SelectorResultArray<Selectors>) => Result),
Immutable<Result>,
(...args: SelectorResultArray<Selectors>) => Result,
GetParamsFromSelectors<Selectors>,
Keys
> &
Expand All @@ -201,11 +202,11 @@ export interface CreateSelectorFunction<
/** Input selectors as a separate array */
<Selectors extends SelectorArray, Result>(
selectors: [...Selectors],
combiner: (...args: SelectorResultArray<Selectors>) => Result,
combiner: (...args: SelectorResultArray<Selectors>) => Immutable<Result>,
options?: CreateSelectorOptions<MemoizeOptions>
): OutputSelector<
Selectors,
Result,
Immutable<Result>,
(...args: SelectorResultArray<Selectors>) => Result,
GetParamsFromSelectors<Selectors>,
Keys
Expand Down
1 change: 1 addition & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { MergeParameters } from './versionedTypes'
export type { MergeParameters } from './versionedTypes'
export type { Immutable } from './immutable'

/*
*
Expand Down