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

Introduce pre-typed createStructuredSelector via createStructuredSelector.withTypes<RootState>() method #678

Merged

Conversation

aryaemami59
Copy link
Contributor

This PR:

  • Implements the ability to create a pre-typed version of createStructuredSelector, analogous to the existing createAsyncThunk.withTypes()
  • Adds createStructuredSelector.withTypes.test-d.ts type test file
  • Adds createStructuredSelector.withTypes.test.ts to test runtime behavior of createStructuredSelector.withTypes
  • Adds JSDocs for createStructuredSelector.withTypes
  • Adds createStructuredSelector.withTypes to docs with examples

Copy link

netlify bot commented Jan 4, 2024

Deploy Preview for reselect-docs canceled.

Name Link
🔨 Latest commit 1368970
🔍 Latest deploy log https://app.netlify.com/sites/reselect-docs/deploys/6597d20ccfc25f000710ce42

Copy link

codesandbox-ci bot commented Jan 4, 2024

This pull request is automatically built and testable in CodeSandbox.

To see build info of the built libraries, click here or the icon next to each commit SHA.

Latest deployment of this branch, based on commit 1368970:

Sandbox Source
Vanilla Typescript Configuration

@aryaemami59 aryaemami59 force-pushed the createStructuredSelector-withTypes branch from 4cc0883 to 3e39fcc Compare January 5, 2024 00:02
  - The description was removed since it was not accurate in describing what the type does,
  - Added todo comments to remove certain test blocks after removal of `TypedStructuredSelectorCreator`.
@aryaemami59 aryaemami59 marked this pull request as ready for review January 5, 2024 07:41
@EskiMojo14 EskiMojo14 merged commit a39fe9e into reduxjs:master Jan 5, 2024
20 checks passed
@aryaemami59 aryaemami59 changed the title Introduce pre-typed createStructuredSelector via createStructuredSelector.ts.withTypes<RootState>() method Introduce pre-typed createStructuredSelector via createStructuredSelector.withTypes<RootState>() method Jan 7, 2024
@aryaemami59 aryaemami59 deleted the createStructuredSelector-withTypes branch January 7, 2024 13:30
descope bot referenced this pull request in descope/descope-js Mar 19, 2024
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [reselect](https://togithub.com/reduxjs/reselect) | dependencies |
minor | [`5.0.1` ->
`5.1.0`](https://renovatebot.com/diffs/npm/reselect/5.0.1/5.1.0) |

---

### Release Notes

<details>
<summary>reduxjs/reselect (reselect)</summary>

###
[`v5.1.0`](https://togithub.com/reduxjs/reselect/releases/tag/v5.1.0)

[Compare
Source](https://togithub.com/reduxjs/reselect/compare/v5.0.1...v5.1.0)

This **minor release**:

- Adds a new `createSelector.withTypes<RootState>()` and
`createStructuredSelector.withTypes<RootState>()` API
- Deprecates the `TypedStructuredSelectorCreator` type introduced in 5.0
- Aims to reduce false positives in `identityFunctionCheck` by only
running if the output selector is passed one argument
- Fixes a bug with `weakMapMemoize`'s `resultEqualityCheck` when used
with a primitive result.

##### `withTypes`

Most commonly, selectors will accept the root state of a Redux store as
their first argument. `withTypes` allows you to specify what that first
argument will be ahead of creating the selector, meaning it doesn't have
to be specified.

```ts
// previously
export const selectPostById = createSelector(
  [
    (state: RootState) => state.posts.entities,
    (state: RootState, id: number) => id,
  ],
  (entities, id) => entities[id],
);
// now
export const createAppSelector = createSelector.withTypes<RootState>();

export const selectPostById = createAppSelector(
  [(state) => state.posts.entities, (state, id: number) => id],
  (entities, id) => entities[id],
);
```

##### Known limitations

Due to a Typescript issue, inference of the output selector's parameters
only works with `withTypes` when using an array of input selectors.

If using the variadic version, you can either wrap your input selectors
in an array instance (as above), or annotate the parameters manually.

```ts
export const createAppSelector = createSelector.withTypes<RootState>();

export const selectPostById = createAppSelector(
  (state) => state.posts.entities, 
  (state, id: number) => id,
  // parameters cannot be inferred, so need annotating
  (entities: Record<number, Post>, id: number) => entities[id],
);
```

##### What's Changed

- Reduce `identityFunctionCheck` false positives by
[@&#8203;Methuselah96](https://togithub.com/Methuselah96) in
[https://github.com/reduxjs/reselect/pull/660](https://togithub.com/reduxjs/reselect/pull/660)
- Fix cut content inside TOC of docs by
[@&#8203;aryaemami59](https://togithub.com/aryaemami59) in
[https://github.com/reduxjs/reselect/pull/664](https://togithub.com/reduxjs/reselect/pull/664)
- Remove redundant Svg requires from components in docs by
[@&#8203;aryaemami59](https://togithub.com/aryaemami59) in
[https://github.com/reduxjs/reselect/pull/665](https://togithub.com/reduxjs/reselect/pull/665)
- Fix `_lastResult.deref` is not a function (it is undefined) in React
Native and Expo applications by
[@&#8203;aryaemami59](https://togithub.com/aryaemami59) in
[https://github.com/reduxjs/reselect/pull/671](https://togithub.com/reduxjs/reselect/pull/671)
- Update getting-started.mdx by
[@&#8203;cchaonie](https://togithub.com/cchaonie) in
[https://github.com/reduxjs/reselect/pull/672](https://togithub.com/reduxjs/reselect/pull/672)
- Update createSelectorCreator.mdx with correct defaults by
[@&#8203;lukeapage](https://togithub.com/lukeapage) in
[https://github.com/reduxjs/reselect/pull/674](https://togithub.com/reduxjs/reselect/pull/674)
- Introduce pre-typed `createSelector` via
`createSelector.withTypes<RootState>()` method by
[@&#8203;aryaemami59](https://togithub.com/aryaemami59) in
[https://github.com/reduxjs/reselect/pull/673](https://togithub.com/reduxjs/reselect/pull/673)
- Bump RTK and React-Redux to latest versions by
[@&#8203;aryaemami59](https://togithub.com/aryaemami59) in
[https://github.com/reduxjs/reselect/pull/676](https://togithub.com/reduxjs/reselect/pull/676)
- add publish job by
[@&#8203;EskiMojo14](https://togithub.com/EskiMojo14) in
[https://github.com/reduxjs/reselect/pull/677](https://togithub.com/reduxjs/reselect/pull/677)
- Wrap up implementation of `TypedStructuredSelectorCreator` by
[@&#8203;aryaemami59](https://togithub.com/aryaemami59) in
[https://github.com/reduxjs/reselect/pull/667](https://togithub.com/reduxjs/reselect/pull/667)
- Introduce pre-typed `createStructuredSelector` via
`createStructuredSelector.ts.withTypes<RootState>()` method by
[@&#8203;aryaemami59](https://togithub.com/aryaemami59) in
[https://github.com/reduxjs/reselect/pull/678](https://togithub.com/reduxjs/reselect/pull/678)
- Bump `vitest` to v1 by
[@&#8203;aryaemami59](https://togithub.com/aryaemami59) in
[https://github.com/reduxjs/reselect/pull/668](https://togithub.com/reduxjs/reselect/pull/668)

##### New Contributors

- [@&#8203;Methuselah96](https://togithub.com/Methuselah96) made their
first contribution in
[https://github.com/reduxjs/reselect/pull/660](https://togithub.com/reduxjs/reselect/pull/660)
- [@&#8203;cchaonie](https://togithub.com/cchaonie) made their first
contribution in
[https://github.com/reduxjs/reselect/pull/672](https://togithub.com/reduxjs/reselect/pull/672)

**Full Changelog**:
reduxjs/reselect@v5.0.1...v5.1.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://togithub.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4xNzAuMCIsInVwZGF0ZWRJblZlciI6IjM3LjE3MC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: descope[bot] <descope[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants