TanStack Angular Query integration for tRPC
npm install @heddendorp/tanstack-angular-query> tRPC Angular Query integration for type-safe API calls with Angular
``bash`
npm install @trpc/client @trpc/server @tanstack/angular-query-experimental tanstack-angular-query
First, create your tRPC client:
`typescript
import { createTRPCClient, httpBatchLink } from "@trpc/client";
import type { AppRouter } from "./server"; // Import your router type
const trpc = createTRPCClient
links: [
httpBatchLink({
url: "/api/trpc",
}),
],
});
`
In your main.ts or app config:
`typescript
import { bootstrapApplication } from "@angular/platform-browser";
import { provideAngularQuery, QueryClient } from "@tanstack/angular-query-experimental";
import { provideTRPC } from "tanstack-angular-query";
import { AppComponent } from "./app/app.component";
bootstrapApplication(AppComponent, {
providers: [
provideAngularQuery(new QueryClient()),
provideTRPC(trpc),
// ... other providers
],
});
`
`typescript
import { Component, inject } from "@angular/core";
import { injectTRPC } from "tanstack-angular-query";
import { injectQuery } from "@tanstack/angular-query-experimental";
@Component({
selector: "app-example",
template:
Loading...
Error: {{ query.error()?.message }}
{{ query.data()?.message }}
,
})
export class ExampleComponent {
private trpc = injectTRPC(); query = injectQuery(this.trpc.hello.queryOptions({ text: "World" }));
}
`$3
`typescript
import { Component, inject } from "@angular/core";
import { injectTRPC } from "tanstack-angular-query";
import { injectMutation } from "@tanstack/angular-query-experimental";@Component({
selector: "app-mutation-example",
template:
,
})
export class MutationExampleComponent {
private trpc = injectTRPC(); mutation = injectMutation(this.trpc.createPost.mutationOptions());
}
`$3
`typescript
import { Component, inject } from "@angular/core";
import { injectTRPC } from "tanstack-angular-query";
import { injectInfiniteQuery } from "@tanstack/angular-query-experimental";@Component({
selector: "app-infinite-example",
template:
,
})
export class InfiniteExampleComponent {
private trpc = injectTRPC(); infiniteQuery = injectInfiniteQuery(
this.trpc.posts.infiniteQueryOptions({
limit: 10,
initialCursor: null,
getNextPageParam: (lastPage) => lastPage.nextCursor,
}),
);
}
`$3
`typescript
import { Component, inject } from "@angular/core";
import { injectTRPC, injectTRPCSubscription } from "tanstack-angular-query";@Component({
selector: "app-subscription-example",
template:
Connecting...
Error: {{ subscription.error?.message }}
{{ subscription.data }}
,
})
export class SubscriptionExampleComponent {
private trpc = injectTRPC(); subscription = injectTRPCSubscription(this.trpc.messages.subscriptionOptions({ channel: "general" }));
}
``Sets up tRPC with Angular Query integration.
Returns the tRPC proxy with query, mutation, and subscription options.
Returns the raw tRPC client instance.
Hook for handling tRPC subscriptions with reactive state.
Creates typed injection functions for a specific router type.
- 🔧 Type Safety: Full TypeScript support with automatic type inference
- 📡 Reactive: Built on Angular signals for reactive state management
- 🔄 Caching: Leverages TanStack Query's powerful caching capabilities
- 🎯 Optimistic Updates: Support for optimistic updates and mutations
- 📊 Infinite Queries: Built-in support for infinite/paginated queries
- 🔌 Subscriptions: Real-time subscriptions with automatic cleanup
- 🎨 Angular Native: Designed specifically for Angular with proper DI integration
MIT