之前在 https://ruby-china.org/topics/42643 这个帖子提到过在 Rails 端生成带类型的 API 调用函数,来让前后端通信实现类型安全,现在终于做成成品 gem 了。
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 也可以加上。