[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-10322":3},{"id":4,"name":5,"fullName":6,"owner":5,"repo":5,"description":7,"homepage":8,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":16,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":18,"rankGlobal":9,"rankLanguage":9,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":20,"hasPages":22,"topics":23,"createdAt":9,"pushedAt":9,"updatedAt":35,"readmeContent":36,"aiSummary":37,"trendingCount":15,"starSnapshotCount":15,"syncStatus":38,"lastSyncTime":39,"discoverSource":40},10322,"ts-rest","ts-rest\u002Fts-rest","RPC-like client, contract, and server implementation for a pure REST API","https:\u002F\u002Fts-rest.com",null,"TypeScript",3313,173,7,106,0,3,11,28.72,"MIT License",false,"main",true,[24,25,26,27,28,29,30,31,32,33,34],"api","fastify","nestjs","nextjs","openapi","react","react-query","rest","rpc","solid","typescript","2026-06-12 02:02:20","# ts-rest\n\n\u003Cp align=\"center\">\n \u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F109956939?s=400&u=8bf67b1281da46d64eab85f48255cd1892bf0885&v=4\" height=\"150\">\u003C\u002Fimg>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">Incrementally adoptable RPC-like client and server helpers for a magical end to end typed experience 🪄\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\">\n    \u003Cimg alt=\"GitHub Repo stars\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fts-rest\u002Fts-rest\"\u002F>\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@ts-rest\u002Fcore\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fdm\u002F%40ts-rest\u002Fcore\"\u002F>\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fblob\u002Fmain\u002FLICENSE\">\n    \u003Cimg alt=\"License\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fts-rest\u002Fts-rest\"\u002F>\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fbundlephobia.com\u002Fpackage\u002F@ts-rest\u002Fcore\">\n    \u003Cimg alt=\"Bundle Size\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbundlephobia\u002Fminzip\u002F@ts-rest\u002Fcore?label=%40ts-rest%2Fcore\"\u002F>\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cdiv align=\"center\">\n  \u003Cdiv>Join us on Discord for help, feedback, and discussions!\u003C\u002Fdiv>\u003Cbr>\u003C\u002Fbr>\n  \u003Ca href=\"https:\u002F\u002Fdiscord.gg\u002F2Megk85k5a\">\n    \u003Cimg src=\"https:\u002F\u002Fdiscordapp.com\u002Fapi\u002Fguilds\u002F1055855205960392724\u002Fwidget.png?style=banner2\" alt=\"Discord Shield\"\u002F>\n  \u003C\u002Fa>\n\u003C\u002Fdiv>\n\n# Introduction\n\nts-rest offers a simple way to define a contract for your API, which can be both consumed and implemented by your application, giving you end to end type safety without the hassle or code generation.\n\n### Features\n\n- End-to-end type safety 🛟\n- RPC-like client side API ⚡️\n- Small Bundle Size 📉\n- No Code Generation 🏃‍♀️\n- Zod support for runtime validation 🔒\n- Full optional OpenAPI integration 📝\n\n\u003Cdiv align=\"center\">\n  \u003Ch3>👉 Start reading the official \u003Ca href=\"https:\u002F\u002Fts-rest.com\u002Fdocs\u002Fquickstart?utm_source=github&utm_medium=documentation&utm_campaign=readme\">Quickstart Guide\u003C\u002Fa> 👈\u003C\u002Fh3>\n\u003C\u002Fdiv>\n\n### Super Simple Example\n\nEasily define your API contract somewhere shared\n\n```typescript\nconst contract = c.router({\n  getPosts: {\n    method: 'GET',\n    path: '\u002Fposts',\n    query: z.object({\n      skip: z.number(),\n      take: z.number(),\n    }), \u002F\u002F \u003C-- Zod schema\n    responses: {\n      200: c.type\u003CPost[]>(), \u002F\u002F \u003C-- OR normal TS types\n    },\n    headers: z.object({\n      'x-pagination-page': z.coerce.number().optional(),\n    }),\n  },\n});\n```\n\nFulfill the contract on your server, with a type-safe router:\n\n```typescript\nconst router = s.router(contract, {\n  getPosts: async ({ params: { id } }) => {\n    return {\n      status: 200,\n      body: prisma.post.findUnique({ where: { id } }),\n    };\n  },\n});\n```\n\nConsume the api on the client with a RPC-like interface:\n\n```typescript\nconst result = await client.getPosts({\n  headers: { 'x-pagination-page': 1 },\n  query: { skip: 0, take: 10 },\n  \u002F\u002F ^-- Fully typed!\n});\n```\n\n## Quickstart\n\nCreate a contract, implement it on your server then consume it in your client. Incrementally adopt, trial it with your team, then get shipping faster.\n\n\u003Cdiv align=\"center\">\n  \u003Ch3>👉 Start reading the official \u003Ca href=\"https:\u002F\u002Fts-rest.com\u002Fdocs\u002Fquickstart?utm_source=github&utm_medium=documentation&utm_campaign=readme\">Quickstart Guide\u003C\u002Fa> 👈\u003C\u002Fh3>\n\u003C\u002Fdiv>\n\n## Contributors ✨\n\nMASSIVE Thanks to all of these wonderful people ([emoji key](https:\u002F\u002Fallcontributors.org\u002Fdocs\u002Fen\u002Femoji-key)), who have helped make ts-rest possible:\n\n\u003C!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n\u003C!-- prettier-ignore-start -->\n\u003C!-- markdownlint-disable -->\n\u003Ctable>\n  \u003Ctbody>\n    \u003Ctr>\n      \u003Ctd align=\"center\" valign=\"top\" width=\"14.28%\">\u003Ca href=\"http:\u002F\u002Fgabro.la\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1728215?v=4?s=100\" width=\"100px;\" alt=\"Youssef Gaber\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Youssef Gaber\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=Gabrola\" title=\"Code\">💻\u003C\u002Fa> \u003Ca href=\"#ideas-Gabrola\" title=\"Ideas, Planning, & Feedback\">🤔\u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=Gabrola\" title=\"Tests\">⚠️\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd align=\"center\" valign=\"top\" width=\"14.28%\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnetiperher\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F45091747?v=4?s=100\" width=\"100px;\" alt=\"Per Hermansson\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Per Hermansson\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=netiperher\" title=\"Documentation\">📖\u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=netiperher\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd align=\"center\" valign=\"top\" width=\"14.28%\">\u003Ca href=\"https:\u002F\u002Fghoullier.deno.dev\u002F\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F2315749?v=4?s=100\" width=\"100px;\" alt=\"Grégory Houllier\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Grégory Houllier\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=ghoullier\" title=\"Documentation\">📖\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd align=\"center\" valign=\"top\" width=\"14.28%\">\u003Ca href=\"http:\u002F\u002Fmichaelangrivera.com\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F55844504?v=4?s=100\" width=\"100px;\" alt=\"Michael Angelo \"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Michael Angelo \u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=michaelangrivera\" title=\"Documentation\">📖\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd align=\"center\" valign=\"top\" width=\"14.28%\">\u003Ca href=\"https:\u002F\u002Fpieter.venter.pro\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1845861?v=4?s=100\" width=\"100px;\" alt=\"Pieter Venter\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Pieter Venter\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=cyrus-za\" title=\"Documentation\">📖\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd align=\"center\" valign=\"top\" width=\"14.28%\">\u003Ca href=\"http:\u002F\u002Frifaldhiaw.com\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F7936061?v=4?s=100\" width=\"100px;\" alt=\"Rifaldhi AW\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Rifaldhi AW\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=rifaldhiaw\" title=\"Documentation\">📖\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd align=\"center\" valign=\"top\" width=\"14.28%\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FJwcode-uk\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F30149596?v=4?s=100\" width=\"100px;\" alt=\"Jonathan White \"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Jonathan White \u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=Jwcode-uk\" title=\"Code\">💻\u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=Jwcode-uk\" title=\"Documentation\">📖\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd align=\"center\" valign=\"top\" width=\"14.28%\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgingermusketeer\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1177034?v=4?s=100\" width=\"100px;\" alt=\"Max Brosnahan\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Max Brosnahan\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=gingermusketeer\" title=\"Code\">💻\u003C\u002Fa> \u003Ca href=\"#ideas-gingermusketeer\" title=\"Ideas, Planning, & Feedback\">🤔\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd align=\"center\" valign=\"top\" width=\"14.28%\">\u003Ca href=\"https:\u002F\u002Foliverbutler.uk\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F47489826?v=4?s=100\" width=\"100px;\" alt=\"Oliver Butler\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Oliver Butler\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=oliverbutler\" title=\"Code\">💻\u003C\u002Fa> \u003Ca href=\"#ideas-oliverbutler\" title=\"Ideas, Planning, & Feedback\">🤔\u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=oliverbutler\" title=\"Documentation\">📖\u003C\u002Fa> \u003Ca href=\"#infra-oliverbutler\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇\u003C\u002Fa> \u003Ca href=\"#maintenance-oliverbutler\" title=\"Maintenance\">🚧\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd align=\"center\" valign=\"top\" width=\"14.28%\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbaryla\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F10336085?v=4?s=100\" width=\"100px;\" alt=\"Adrian Barylski\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Adrian Barylski\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=baryla\" title=\"Code\">💻\u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=baryla\" title=\"Documentation\">📖\u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=baryla\" title=\"Tests\">⚠️\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd align=\"center\" valign=\"top\" width=\"14.28%\">\u003Ca href=\"https:\u002F\u002Fnad.dev\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6670753?v=4?s=100\" width=\"100px;\" alt=\"Neil A. Dobson\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Neil A. Dobson\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=neildobson-au\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd align=\"center\" valign=\"top\" width=\"14.28%\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdohaicuong\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F20808725?v=4?s=100\" width=\"100px;\" alt=\"Eric Do\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Eric Do\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=dohaicuong\" title=\"Documentation\">📖\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd align=\"center\" valign=\"top\" width=\"14.28%\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ffruchtzwerg\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F15377955?v=4?s=100\" width=\"100px;\" alt=\"Ben\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Ben\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=fruchtzwerg\" title=\"Code\">💻\u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=fruchtzwerg\" title=\"Documentation\">📖\u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=fruchtzwerg\" title=\"Tests\">⚠️\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd align=\"center\" valign=\"top\" width=\"14.28%\">\u003Ca href=\"https:\u002F\u002Fllllvvuu.dev\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F5601392?v=4?s=100\" width=\"100px;\" alt=\"LW\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>LW\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=llllvvuu\" title=\"Code\">💻\u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fissues?q=author%3Allllvvuu\" title=\"Bug reports\">🐛\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd align=\"center\" valign=\"top\" width=\"14.28%\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Favancealaska\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F72231502?v=4?s=100\" width=\"100px;\" alt=\"Andrew Vance\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Andrew Vance\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fts-rest\u002Fts-rest\u002Fcommits?author=avancealaska\" title=\"Documentation\">📖\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n\u003C!-- markdownlint-restore -->\n\u003C!-- prettier-ignore-end -->\n\n\u003C!-- ALL-CONTRIBUTORS-LIST:END -->\n\n## Star History\n\nSince our first commit in 2022 we've been growing steadily. We're proud of our progress and we're excited about the future.\n\n\u003Cdiv align=\"center\">\n\u003Ca href=\"https:\u002F\u002Fstar-history.com\u002F#ts-rest\u002Fts-rest&Timeline\">\n  \u003Cpicture>\n    \u003Csource media=\"(prefers-color-scheme: dark)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=ts-rest\u002Fts-rest&type=Timeline&theme=dark\" \u002F>\n    \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=ts-rest\u002Fts-rest&type=Timeline\" \u002F>\n    \u003Cimg alt=\"Star History Chart\" src=\"https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=ts-rest\u002Fts-rest&type=Timeline\" \u002F>\n  \u003C\u002Fpicture>\n\u003C\u002Fa>\n\u003C\u002Fdiv>\n\n\u003Cdiv align=\"center\" >\n  \u003Cdiv>Join us on Discord for help, feedback, and discussions!\u003C\u002Fdiv>\u003Cbr>\u003C\u002Fbr>\n  \u003Ca href=\"https:\u002F\u002Fdiscord.gg\u002F2Megk85k5a\">\n    \u003Cimg src=\"https:\u002F\u002Fdiscordapp.com\u002Fapi\u002Fguilds\u002F1055855205960392724\u002Fwidget.png?style=banner2\" alt=\"Discord Shield\"\u002F>\n  \u003C\u002Fa>\n\u003C\u002Fdiv>\n\n\u003Cdiv  align=\"center\">\n  \u003Ca\n    href=\"https:\u002F\u002Fvercel.com\u002F?utm_source=ts-rest&utm_campaign=oss\"\n    target=\"_blank\"\n    rel=\"noreferrer\"\n  >\n    \u003Cimg\n      src=\"https:\u002F\u002Fts-rest.com\u002Fimg\u002Fpowered-by-vercel.svg\"\n      alt=\"Powered by Vercel\"\n      height=\"40\"\n    \u002F>\n  \u003C\u002Fa>\n\u003C\u002Fdiv>\n","ts-rest 是一个用于纯 REST API 的 RPC 风格客户端、契约和服务端实现。其核心功能包括端到端的类型安全、RPC 风格的客户端 API 以及对 Zod 的支持以实现实时验证，同时无需代码生成且保持较小的包体积。此外，它还提供了可选的 OpenAPI 集成。适用于需要在前端和后端之间进行强类型通信的应用场景，特别是在使用 TypeScript 构建项目时能够显著提升开发效率与代码质量。无论是快速原型设计还是大型企业级应用开发，ts-rest 都能提供高效、可靠的解决方案。",2,"2026-06-11 03:27:47","top_topic"]