function queryOptions<TQueryFnData, TError, TData, TQueryKey>(options): Omit<CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>, "queryFn"> & object & QueryKeyWithDataTag<TQueryKey, TQueryFnData, TError>;Defined in: query-options.ts:151
You can generally pass everything to queryOptions that you can also pass to injectQuery. These options can be shared across functions and imperative APIs such as queryClient.fetchQuery. options.queryKey is required and is the query key to generate options for.
This overload is selected when initialData is set, so the resulting data is never undefined (unless a select changes TData to include undefined).
TQueryFnData = unknown
TError = Error
TData = TQueryFnData
TQueryKey extends readonly unknown[] = readonly unknown[]
DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>
The DefinedInitialDataOptions to use — everything you can pass to injectQuery, with initialData set.
The same options object, typed so that queryKey carries the inferred data type.
import { queryOptions, injectQuery } from '@tanstack/angular-query-experimental'
export const postsOptions = queryOptions({
queryKey: ['posts'],
queryFn: fetchPosts,
initialData: [],
})
@Component({
selector: 'posts',
template: `
<!-- `postsQuery.data()` is never `undefined`, thanks to `initialData` — even if a refetch
fails, so the list stays visible alongside the error. -->
@if (postsQuery.isError()) {
<span>Error: {{ postsQuery.error()?.message }}</span>
}
<ul>
@for (post of postsQuery.data(); track post.id) {
<li>{{ post.title }}</li>
}
</ul>
`,
})
export class Posts {
readonly postsQuery = injectQuery(() => postsOptions)
}function queryOptions<TQueryFnData, TError, TData, TQueryKey>(options): OmitKeyof<CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>, "queryFn"> & object & QueryKeyWithDataTag<TQueryKey, TQueryFnData, TError>;Defined in: query-options.ts:200
You can generally pass everything to queryOptions that you can also pass to injectQuery. These options can be shared across functions and imperative APIs such as queryClient.fetchQuery. options.queryKey is required and is the query key to generate options for.
TQueryFnData = unknown
TError = Error
TData = TQueryFnData
TQueryKey extends readonly unknown[] = readonly unknown[]
UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey>
The UnusedSkipTokenOptions to use — everything you can pass to injectQuery.
The same options object, typed so that queryKey carries the inferred data type.
A parameterized factory, so the same options object can be reused per id:
import { queryOptions, injectQuery } from '@tanstack/angular-query-experimental'
export const postOptions = (id: string) =>
queryOptions({
queryKey: ['post', id],
queryFn: () => fetchPost(id),
})
@Component({
selector: 'post',
template: `
@if (postQuery.isPending()) {
Loading...
} @else if (postQuery.isError()) {
<span>Error: {{ postQuery.error()?.message }}</span>
} @else {
<h1>{{ postQuery.data().title }}</h1>
}
`,
})
export class Post {
readonly id = signal('1')
readonly postQuery = injectQuery(() => postOptions(this.id()))
}function queryOptions<TQueryFnData, TError, TData, TQueryKey>(options): CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey> & object & QueryKeyWithDataTag<TQueryKey, TQueryFnData, TError>;Defined in: query-options.ts:281
You can generally pass everything to queryOptions that you can also pass to injectQuery. These options can be shared across functions and imperative APIs such as queryClient.fetchQuery. options.queryKey is required and is the query key to generate options for.
TQueryFnData = unknown
TError = Error
TData = TQueryFnData
TQueryKey extends readonly unknown[] = readonly unknown[]
UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>
The UndefinedInitialDataOptions to use — everything you can pass to injectQuery.
The same options object, typed so that queryKey carries the inferred data type.
This is the only overload that accepts queryFn: skipToken, shown below.
A parameterized factory, so the same options object can be reused per id:
import { queryOptions, injectQuery } from '@tanstack/angular-query-experimental'
export const postOptions = (id: string) =>
queryOptions({
queryKey: ['post', id],
queryFn: () => fetchPost(id),
})
@Component({
selector: 'post',
template: `
@if (postQuery.isPending()) {
Loading...
} @else if (postQuery.isError()) {
<span>Error: {{ postQuery.error()?.message }}</span>
} @else {
<h1>{{ postQuery.data().title }}</h1>
}
`,
})
export class Post {
readonly id = signal('1')
readonly postQuery = injectQuery(() => postOptions(this.id()))
}A factory that disables the query, type safe, until postId is set:
import { queryOptions, skipToken, injectQuery } from '@tanstack/angular-query-experimental'
export const postOptions = (postId: number | undefined) =>
queryOptions({
queryKey: ['post', postId],
queryFn: postId != null ? () => fetchPost(postId) : skipToken,
})
@Component({
selector: 'post',
template: `
@if (postId() == null) {
Select a post
} @else if (postQuery.isPending()) {
Loading...
} @else if (postQuery.isError()) {
<span>Error: {{ postQuery.error()?.message }}</span>
} @else {
<h1>{{ postQuery.data().title }}</h1>
}
`,
})
export class Post {
readonly postId = signal<number | undefined>(undefined)
readonly postQuery = injectQuery(() => postOptions(this.postId()))
}