[Ruby on Rails 相关] Camille:让前端和 Rails 进行类型安全的通信

2023-03-20 09:06:46 +08:00
 mizuhashi

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

1222 次点击
所在节点    分享创造
5 条回复
tonyrft
2023-03-20 09:58:32 +08:00
这和 protobuf 及 openapi 一流有什么区别么
mywaiting
2023-03-20 10:00:49 +08:00
这算是 Rails 版本的 tRPC.io 吗?
liubaicai
2023-03-20 10:07:27 +08:00
难得见一个用 ror 的
mizuhashi
2023-03-20 10:45:27 +08:00
@tonyrft 不太了解这两个,能做的事估计差不多,可能比较简洁
mizuhashi
2023-03-20 10:45:51 +08:00
@mywaiting 确实有受 trpc 启发,开发体验估计还是 trpc 更好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/925413

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX