FisherHub Blog
← 返回列表 | 工具笔记

Hono RPC 模式:类型安全的 API 调用

告别 REST 的类型体操——Hono RPC 让前后端共享类型,编译期发现错误

传统 REST 的痛点

// 前端调用
const res = await fetch('/api/users/123');
const user = await res.json(); // 类型是 any 😞

每次调用都要手动写类型、检查字段名拼写、猜返回结构。

Hono RPC 的解法

服务端定义路由时导出类型:

// server.ts
import { Hono } from 'hono';

const app = new Hono()
  .get('/users/:id', async (c) => {
    const id = c.req.param('id');
    return c.json({ id, name: 'Alice', email: 'alice@example.com' });
  })
  .post('/users', async (c) => {
    const body = await c.req.json<{ name: string }>();
    return c.json({ id: 'new', ...body }, 201);
  });

export type AppType = typeof app;
export default app;

客户端使用 hc(Hono Client):

// client.ts
import { hc } from 'hono/client';
import type { AppType } from './server';

const client = hc<AppType>('http://localhost:3000');

// ✅ 编译期类型检查!
const res = await client.users[':id'].$get({ param: { id: '123' } });
const user = await res.json();
//    ^? { id: string; name: string; email: string }

const createRes = await client.users.$post({
  json: { name: 'Bob' }, // ✅ 参数类型也检查
});

实战:Astro + Hono RPC

在 SSR 模式下,前后端共享同一份 Hono 类型:

src/
├── api/
│   └── server.ts      # Hono 应用 + 类型导出
├── pages/
│   ├── api/
│   │   └── [...route].ts  # 代理 Hono 路由
│   └── index.astro   # 使用 hc 调用 API

关键: RPC 模式让你在写前端代码时获得 IDE 的完整智能提示和类型检查,这在传统 REST 架构中几乎不可能做到。