Skip to content
Draft
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
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { createInfiniteQuery, infiniteQueryOptions } from '../../src/index.js'
import type { InfiniteData } from '@tanstack/query-core'

describe('queryOptions', () => {
// eslint-disable-next-line vitest/expect-expect
Copy link
Collaborator

Choose a reason for hiding this comment

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

assertType of vitest could be better for this case
Could you check that?

Copy link
Contributor Author

@sukvvon sukvvon Jul 26, 2025

Choose a reason for hiding this comment

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

@manudeli

  test('Should not allow excess properties', () => {
    const options = infiniteQueryOptions({
      queryKey: ['key'],
      queryFn: () => Promise.resolve('data'),
      getNextPageParam: () => 1,
      initialPageParam: 1,
      // @ts-expect-error this is a good error, because stallTime does not exist!
      stallTime: 1000,
    })

    expectTypeOf(options).toEqualTypeOf<
      CreateInfiniteQueryOptions<
        string,
        Error,
        InfiniteData<string, unknown>,
        Array<string>,
        number
      >
    >()
  })

How about this?

Copy link
Collaborator

Choose a reason for hiding this comment

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

@mmkal (expect-type member) @sheremet-va @antfu (vitest member)

I used to think assertType in vitest was the best way to type test for cases like this, but I'm not entirely sure now. What is the best way to handle vitest/expect-expect when testing for these ts-expect-errors with vitest eslint? Could you share your thoughts?

Copy link

Choose a reason for hiding this comment

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

You could do something like

expectTypeOf(infiniteQueryOptions).toBeCallableWith({
  queryKey: ['foo'],
  ...
})

Which I believe vitest/expect-expect will allow, and it's pretty clear what the purpose of the test is that way too.

If that's still a linter error, I believe the expect-expect rule can be configured to allow expectTypeOf - although this would be worth allowing by default in vitest since it's built-in.

Copy link
Collaborator

Choose a reason for hiding this comment

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

Thanks for sharing your thought! I will try it❤️

Copy link
Collaborator

Choose a reason for hiding this comment

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

@mmkal I tried toBeCallable but it seems like expectTypeOf().toBeCallableWith isn't always doing what I'd expect compared to just calling the function directly 🥲
Could this be a bug in expect-type, or is it just a TypeScript limitation?

Aug-02-2025.01-20-16.mp4

Copy link

Choose a reason for hiding this comment

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

Ah, yes, it's using extends so won't do the excess property check - and yes that's a typescript limitation that probably can't be worked around in expect-type.

You can still have the test for the excess property if you go more explicit:

expectTypeOf(infiniteQueryOptions).toBeCallableWith({ 
  queryKey: ['key'],
  queryFn: () => Promise.resolve('data'),
  getNextPageParam: () => 1,
  initialPageParam: 1,
})
expectTypeOf(infiniteQueryOptions).parameter(0).not.toHaveProperty('stallTime')

That second assertion does what you're looking for - if the function parameter allowed [key: string]: unknown it would fail. But understandable if you don't want to go so all-in on expect-type in this change.

test('Should not allow excess properties', () => {
infiniteQueryOptions({
queryKey: ['key'],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { createQueries, queryOptions } from '../../src/index.js'
import type { QueryObserverResult } from '@tanstack/query-core'

describe('queryOptions', () => {
// eslint-disable-next-line vitest/expect-expect
test('Should not allow excess properties', () => {
queryOptions({
queryKey: ['key'],
Expand Down Expand Up @@ -177,6 +178,7 @@ describe('queryOptions', () => {
>()
})

// eslint-disable-next-line vitest/expect-expect
test('Should allow undefined response in initialData', () => {
return (id: string | null) =>
queryOptions({
Expand Down
Loading