
Github Repo: https://github.com/onyxblade/camille
用 Rails 做 API server 的时候,我们返回的 json 是没有经过类型检查的,这样即使前端用上了 typescript ,我们也不能保证 Rails 返回的 JSON 是预期的结构和类型。于是我做了这个 gem 来在 Rails 端定义 API 接口的类型,并生成 ts 的调用函数,这样调用的参数和返回就都是类型安全的了。
简而言之它的作用就是可以给 controller action 的 params 和 response 加上类型,例如对一个books#create action ,可以通过下面的代码加上类型:
using Camille::Syntax class Camille::Schemas::Books < Camille::Schema include Camille::Types post :create do params( book: { name: String, author: String, retail_price: Decimal } ) response(Boolean) end end 然后可以生成前端的调用函数:
// This file is automatically generated. import request from './request' export type DateTime = string export type Decimal = number export default { books: { create(params: {book: {name: string, author: string, retailPrice: Decimal}}): Promise<boolean>{ return request('post', '/books/create', params) }, }, } 这样前端可以通过下面的方式调用:
const bool = await endpoints.books.create({ book: { name: 'Metaprogramming Ruby', author: 'Paolo Perrotta', retailPrice: 27.95 } }) 这个调用的参数和返回值都是类型安全的,如果前端出错了 TS 会给出提示,后端出错则会被运行时检查查出来。同时请求的 path 也是不需要程序员管理的,程序员只要调用函数就好,Camille 会确保请求被正确的 action 处理。
https://github.com/onyxblade/camille-tutorial 这里有一个 step by step 的 tutorial ,感兴趣的也可以看看。
Camille 目前做到了支持 typescript 的除了 enum 和 utility types 的绝大部分类型语法( utility types 支持 omit 和 pick ),基本是一模一样的,在这个过程中用到了至今还没见有人用过的 refinement ,算是比较好玩的一点。具体的语法列表可以参见 https://github.com/onyxblade/camille#available-syntax-for-types 。
欢迎试用和反馈,如果有需要的 feature requests 也可以加上。
1 tonyrft 2023-03-20 09:58:32 +08:00 这和 protobuf 及 openapi 一流有什么区别么 |
3 liubaicai 2023-03-20 10:07:27 +08:00 难得见一个用 ror 的 |