diff --git a/src/types.ts b/src/types.ts index 8a3320b07..3cdef1e30 100644 --- a/src/types.ts +++ b/src/types.ts @@ -37,15 +37,14 @@ type GetStateFromSelector = S extends Selector ? State : never export type GetStateFromSelectors = // handle two elements at once so this type works for up to 30 selectors S extends [infer C1, infer C2, ...infer Other] - ? Other extends SelectorArray - ? - | GetStateFromSelector - | GetStateFromSelector - | GetStateFromSelectors - : GetStateFromSelector | GetStateFromSelector + ? Other extends [any] + ? GetStateFromSelector & + GetStateFromSelector & + GetStateFromSelectors + : GetStateFromSelector & GetStateFromSelector : S extends [infer Current, ...infer Other] - ? Other extends SelectorArray - ? GetStateFromSelector | GetStateFromSelectors + ? Other extends [any] + ? GetStateFromSelector & GetStateFromSelectors : GetStateFromSelector : S extends (infer Elem)[] ? GetStateFromSelector diff --git a/typescript_test/test.ts b/typescript_test/test.ts index 8bfc02ab1..55f26a8e6 100644 --- a/typescript_test/test.ts +++ b/typescript_test/test.ts @@ -1060,3 +1060,40 @@ type SelectorArray29 = [ type Results = SelectorResultArray type State = GetStateFromSelectors + +{ + const selector = createSelector( + (state: string) => 1, + (state: number) => 2, + (...args) => 0 + ) + // @ts-expect-error + selector('foo') + // @ts-expect-error + selector(5) +} +{ + const selector = createSelector( + (state: { foo: string }) => 1, + (state: { bar: string }) => 2, + (...args) => 0 + ) + selector({ foo: '', bar: '' }) + // @ts-expect-error + selector({ foo: '' }) + // @ts-expect-error + selector({ bar: '' }) +} + +{ + const selector = createSelector( + (state: { foo: string }) => 1, + (state: { foo: string }) => 2, + (...args) => 0 + ) + // @ts-expect-error + selector({ foo: '', bar: '' }) + selector({ foo: '' }) + // @ts-expect-error + selector({ bar: '' }) +}