Gem Camille:让前端和 Rails 进行类型安全的通信

mizuhashi · 2023年03月20日 · 356 次阅读

之前在 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 也可以加上。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号