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

Fix issues with queryOptions factory method types #8394

Open
wants to merge 8 commits into
base: main
Choose a base branch
from

Conversation

Nick-Lucas
Copy link
Contributor

@Nick-Lucas Nick-Lucas commented Dec 3, 2024

This tackles a few things we've spotted in tRPC:

  • Fix issues with queryOptions factory method types not passing through the query key despite taking it
  • Fix DataTag creating intersections upon intersections when a data-tagged querykey is passed as the first argument, now if its TType arg is already a datatag it just returns the TType

tRPC build here: trpc/trpc#6290

Copy link

nx-cloud bot commented Dec 3, 2024

☁️ Nx Cloud Report

CI is running/has finished running commands for commit e464740. As they complete they will appear below. Click to see the status, the terminal output, and the build insights.

📂 See all runs for this CI Pipeline Execution


✅ Successfully ran 2 targets

Sent with 💌 from NxCloud.

Copy link

pkg-pr-new bot commented Dec 3, 2024

Open in Stackblitz

More templates

@tanstack/angular-query-devtools-experimental

npm i https://pkg.pr.new/@tanstack/angular-query-devtools-experimental@8394

@tanstack/query-async-storage-persister

npm i https://pkg.pr.new/@tanstack/query-async-storage-persister@8394

@tanstack/angular-query-experimental

npm i https://pkg.pr.new/@tanstack/angular-query-experimental@8394

@tanstack/query-broadcast-client-experimental

npm i https://pkg.pr.new/@tanstack/query-broadcast-client-experimental@8394

@tanstack/eslint-plugin-query

npm i https://pkg.pr.new/@tanstack/eslint-plugin-query@8394

@tanstack/query-core

npm i https://pkg.pr.new/@tanstack/query-core@8394

@tanstack/query-devtools

npm i https://pkg.pr.new/@tanstack/query-devtools@8394

@tanstack/query-persist-client-core

npm i https://pkg.pr.new/@tanstack/query-persist-client-core@8394

@tanstack/query-sync-storage-persister

npm i https://pkg.pr.new/@tanstack/query-sync-storage-persister@8394

@tanstack/react-query

npm i https://pkg.pr.new/@tanstack/react-query@8394

@tanstack/react-query-devtools

npm i https://pkg.pr.new/@tanstack/react-query-devtools@8394

@tanstack/react-query-next-experimental

npm i https://pkg.pr.new/@tanstack/react-query-next-experimental@8394

@tanstack/react-query-persist-client

npm i https://pkg.pr.new/@tanstack/react-query-persist-client@8394

@tanstack/solid-query

npm i https://pkg.pr.new/@tanstack/solid-query@8394

@tanstack/solid-query-devtools

npm i https://pkg.pr.new/@tanstack/solid-query-devtools@8394

@tanstack/solid-query-persist-client

npm i https://pkg.pr.new/@tanstack/solid-query-persist-client@8394

@tanstack/svelte-query

npm i https://pkg.pr.new/@tanstack/svelte-query@8394

@tanstack/svelte-query-devtools

npm i https://pkg.pr.new/@tanstack/svelte-query-devtools@8394

@tanstack/svelte-query-persist-client

npm i https://pkg.pr.new/@tanstack/svelte-query-persist-client@8394

@tanstack/vue-query

npm i https://pkg.pr.new/@tanstack/vue-query@8394

@tanstack/vue-query-devtools

npm i https://pkg.pr.new/@tanstack/vue-query-devtools@8394

commit: e464740

: TType & {
[dataTagSymbol]: TValue
[dataTagErrorSymbol]: TError
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixes this:

image

becomes this:

image

Copy link

codecov bot commented Dec 3, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 63.03%. Comparing base (465906a) to head (e464740).
Report is 1 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff             @@
##             main    #8394       +/-   ##
===========================================
+ Coverage   46.21%   63.03%   +16.81%     
===========================================
  Files         198      134       -64     
  Lines        7509     4804     -2705     
  Branches     1711     1344      -367     
===========================================
- Hits         3470     3028      -442     
+ Misses       3664     1536     -2128     
+ Partials      375      240      -135     
Components Coverage Δ
@tanstack/angular-query-devtools-experimental ∅ <ø> (∅)
@tanstack/angular-query-experimental 88.65% <ø> (ø)
@tanstack/eslint-plugin-query ∅ <ø> (∅)
@tanstack/query-async-storage-persister 43.85% <ø> (ø)
@tanstack/query-broadcast-client-experimental ∅ <ø> (∅)
@tanstack/query-codemods ∅ <ø> (∅)
@tanstack/query-core 94.56% <ø> (ø)
@tanstack/query-devtools 4.78% <ø> (ø)
@tanstack/query-persist-client-core 57.73% <ø> (ø)
@tanstack/query-sync-storage-persister 84.61% <ø> (ø)
@tanstack/react-query 95.54% <ø> (ø)
@tanstack/react-query-devtools 10.00% <ø> (ø)
@tanstack/react-query-next-experimental ∅ <ø> (∅)
@tanstack/react-query-persist-client 100.00% <ø> (ø)
@tanstack/solid-query 78.20% <ø> (ø)
@tanstack/solid-query-devtools ∅ <ø> (∅)
@tanstack/solid-query-persist-client 100.00% <ø> (ø)
@tanstack/svelte-query 87.33% <ø> (ø)
@tanstack/svelte-query-devtools ∅ <ø> (∅)
@tanstack/svelte-query-persist-client 100.00% <ø> (ø)
@tanstack/vue-query 71.45% <ø> (ø)
@tanstack/vue-query-devtools ∅ <ø> (∅)

@TkDodo
Copy link
Collaborator

TkDodo commented Dec 4, 2024

There might be more like this as I'm having trouble with linked builds of react-query

can you try the PR preview builds?

npm i https://pkg.pr.new/@tanstack/react-query@8394

@Nick-Lucas
Copy link
Contributor Author

There might be more like this as I'm having trouble with linked builds of react-query

can you try the PR preview builds?

npm i https://pkg.pr.new/@tanstack/react-query@8394

Thanks, that's a life-safer, the content of this PR has tRPC's codebase passing now (trpc/trpc#6290) albeit with one fix for correctness related to the DataTag change: packages/react-query/src/shared/types.ts

@@ -13,7 +13,7 @@ export type UndefinedInitialDataInfiniteOptions<
TQueryFnData,
TError = DefaultError,
TData = InfiniteData<TQueryFnData>,
TQueryKey extends QueryKey = QueryKey,
TQueryKey extends QueryKey = Array<any>,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

my idea was to keep this to:

TQueryKey extends QueryKey = QueryKey,

and then just change what QueryKey is:

- export type QueryKey = ReadonlyArray<unknown>
+ export type QueryKey = Array<any>

Copy link
Contributor Author

@Nick-Lucas Nick-Lucas Dec 7, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right! Sorry my bad, you did write that. Have tried it just to double check but no dice. The initial error about it being readonly is a symptom of the problem, but the full problem is the flipped order of assigning sub-type to super-type caused by the type being referenced in a callback.

image

The fix for this is always to provide your types correctly at the top layer so both directions of structural comparison can pass, and Tanstack Query has been masking this problem through query keys not always being respected on Client methods. This masking became really obvious with the new tRPC Client though because we can't type-anything without the DataTag flowing through

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wait I made another mistake there keeping unknown, will come back

Copy link
Contributor Author

@Nick-Lucas Nick-Lucas Dec 7, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay yep same answer as above:

Array<unknown> -> we get assignment error in callbacks because unknown can't be assigned to a known type

Array<any> -> assignment errors fixed, but we instead of get errors when assigning const/inline keys to query keys (can't assign readonly to mutable)

ReadonlyArray<any> -> we get assignment error in callbacks because they're assigning a readonly to a mutable (but this time in reverse)

Bonus: export type QueryKey = ReadonlyArray<any> | Array<any> also doesn't work, both elements of the union would need to pass checks in callbacks and as above the readonly one can't pass

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Only way to win here is to correctly type interfaces, which anybody using the standard methods in Tanstack Query will get for free, but anybody passing around query options would need to update their argument types as per the one failing test in this PR

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pushed an alternate approach, it's back to where I started but with a clearer user story inspired by tRPC: #8394 (comment)

@Nick-Lucas Nick-Lucas force-pushed the fixing-type-issues branch 3 times, most recently from 9beffc5 to 1f7d0b2 Compare December 11, 2024 21:52
function somethingWithQueryOptions(options: UseQueryOptions<number>) {
function somethingWithQueryOptions<TQueryOpts extends AnyUseQueryOptions>(
options: TQueryOpts,
) {
Copy link
Contributor Author

@Nick-Lucas Nick-Lucas Dec 11, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @TkDodo so I think the other two approaches proved to be dead ends, and I'm also unsure about making major internal changes like those as they risk creating a new wave of breaking issues.

What I propose is we export types like AnyUseQueryOptions, and that way consumers wanting to create flexible re-usable methods can use a more correct form of generics like above (don't necessarily need the generics but for anything non-contrived it's probably useful). This is how tRPC and a few other projects solve this issue and it's rock solid

Changes are pushed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants