-
Notifications
You must be signed in to change notification settings - Fork 126
use public readonly to make compareOptions readable but not writable
#816
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
use public readonly to make compareOptions readable but not writable
#816
Conversation
This fixes a TypeScript error where queryCollectionOptions (and other collection options functions) produce Collections that TypeScript reports as missing the compareOptions property. The issue occurred because: 1. The Collection interface extends CollectionImpl but didn't explicitly declare the compareOptions property 2. CollectionImpl has a compareOptions getter, but TypeScript's Pick utility (used in CollectionLike) couldn't properly resolve it from the interface The fix explicitly declares compareOptions as a readonly property in the Collection interface, making it properly accessible for type checking. Fixes the issue reported in Discord where users get: "Type 'Collection<T, string, any, any, any>' is missing properties: comparisonOpts, compareOptions" Related to PR #762 which added defaultStringCollation support.
🦋 Changeset detectedLatest commit: 823c7ea The changes in this PR will be included in the next version bump. This PR includes changesets to release 11 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
More templates
@tanstack/angular-db
@tanstack/db
@tanstack/db-ivm
@tanstack/electric-db-collection
@tanstack/offline-transactions
@tanstack/powersync-db-collection
@tanstack/query-db-collection
@tanstack/react-db
@tanstack/rxdb-db-collection
@tanstack/solid-db
@tanstack/svelte-db
@tanstack/trailbase-db-collection
@tanstack/vue-db
commit: |
|
Size Change: -16 B (-0.02%) Total Size: 86 kB
ℹ️ View Unchanged
|
|
Size Change: 0 B Total Size: 3.34 kB ℹ️ View Unchanged
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
After looking into this issue and the proposed fixed, it's not clear to me why the error occurs and why this fixes it. We should add a unit test that reproduces the type error. I tried adding one, but i was not able to reproduce this type error.
I don't like this fix. I would rather turn the compareOptions getter into a true readonly property on the CollectionImpl class instead of having to add it to the extends clause as is done in this fix.
|
@kevin-dp we could ask the user to share their code? Also did you try looking at one of the examples? |
…sexZWcJnvipCxfd7rkf
…sexZWcJnvipCxfd7rkf
…sexZWcJnvipCxfd7rkf
This fixes a TypeScript error where collections created with queryCollectionOptions (and other collection option functions) were incorrectly reported as missing the compareOptions property. Changes: 1. Converted compareOptions from a getter to a public readonly property in CollectionImpl class (per Kevin's suggestion) 2. Removed private comparisonOpts field that was used by the getter 3. Added comprehensive type tests to verify compareOptions is accessible The issue occurred because TypeScript's Pick utility (used in CollectionLike) couldn't properly resolve getter properties from extended classes. Making compareOptions a true readonly property ensures proper type resolution. Tests added cover three scenarios: - Collection with queryFn type inference - Collection with schema - Collection with explicit type parameter Fixes the issue reported in Discord where users get: "Type 'Collection<T, string, any, any, any>' is missing properties: comparisonOpts, compareOptions" Related to PR #762 which added defaultStringCollation support.
TypeScript allows setting readonly properties in constructors without error, so the directive is not needed and causes a build error.
|
@KyleAMathews a few days ago on discord you mentioned, that my problem would be related to this. If that is in fact the case, the TS issue I have is very easy to reproduce @kevin-dp. import { z } from 'zod'
import { queryCollectionOptions } from '@tanstack/query-db-collection'
import { QueryClient } from '@tanstack/query-core'
export const queryClient = new QueryClient()
const schema = z
.object({
name: z.string().min(1)
})
.transform((item) => ({ ...item, id: -1, blubb: 'blubb' }))
const options = queryCollectionOptions({
queryKey: ['local-test-array'],
schema,
queryFn: async () => {
return [{
name: 'test',
id: 0
}]
},
getKey: (item) => item.id,
queryClient
})excerpt from '@tanstack/query-core':
specifier: ^5.90.10
version: 5.90.10
'@tanstack/query-db-collection':
specifier: ^1.0.1
version: 1.0.1(@tanstack/db@0.5.1(typescript@5.9.3))(@tanstack/query-core@5.90.10)(typescript@5.9.3)
zod:
specifier: ^4.1.12
version: 4.1.12
|
Adds a test case that exactly reproduces the Discord bug report where a user had a Zod schema with .transform() and was getting the error: 'Type Collection<...> is missing properties: comparisonOpts, compareOptions' This ensures our fix covers this specific edge case.
Adjusted the schema transform test to not pass the schema parameter directly (which causes type issues with ZodEffects), and instead properly type the queryFn return value. This ensures the test validates that compareOptions is accessible while working within the current queryCollectionOptions type constraints. Also fixed eslint warning by prefixing unused schema variable with _.
|
The type error that was reported initially seems to be different from the one reported by @IARI. In the future, let's fix separate bugs in separate PRs. Regarding the original type error, i indeed tried to reproduce it but i couldn't: const todoSchema = z.object({
id: z.string(),
title: z.string(),
completed: z.boolean(),
})
type Todo = z.infer<typeof todoSchema>
const queryClient = new QueryClient()
const todosCollection = createCollection(
queryCollectionOptions({
queryKey: ["todos"],
queryFn: async () => {
const response = await fetch("/api/todos")
return response.json() as Promise<Todo[]>
},
queryClient,
getKey: (item) => item.id,
})
)This type checks without errors. Note that i has to change the OP's typecast to PS: When fixing a bug let's always introduce a unit test reproducing the bug such that we can be sure the fix actually solves the bug and we don't introduce regressions. In this case, i think we were chasing a bug that does no(t) (longer) exist. |
public readonly to make compareOptions readable but not writable

Probably fixes a typescript error.