Skip to content
Blog of ZheXin
Go back

Try Typebox

Edit page

Try Typebox! Now

新博客第一篇文章打算给我的一个 project 引一下流:typebox

这个项目还是花了我不少心血去写的,虽然一开始只是供自己使用,但是看别人也有一点需求就开源出来了

其中也是非常感谢 PuerNya 提供 duration 字段的类型体操,以及 第一个 issue 反馈

为什么要使用 typebox?

typebox 主要解决了以下的问题:

  1. 字段提示:如果你使用任意一个 IDE(如 vs code),编写时就可以享受类型提示,不用担心记不住字段名或拼错
  2. 模块化管理:如果你有写多份配置文件的需求,而它们有共同的部分(如 outbounds),就可以单独编写它,在不同的文件中引用
  3. tag 检查:sing-box 有相当多使用 tag 进行资源引用的设计(如 rule-set,outbound.selector),但是容易遗忘和混淆;typebox 基于 typescript 的类型系统会检查这一点

为什么开发 typebox?

主要还是因为懒(

由于我需要同时管理多人多设备的 sing-box 配置文件,而 .json 文件并不支持引用、导入等模块化方法;sing-box 配置字段多且长,每次都需要对比文档输入,也异常麻烦

因此,花了一下午的时间将所有 sing-box 的配置转成 typescript 的 interface 定义,这样既可以使用 ts 的 export import 进行模块化管理,也能享受字段类型提示

后来,发现 tag 也容易遗漏,有时在 outbound.selector 中引用了某 outbound 的 tag,却忘记把该 outbound 写进 outbounds 里

正好发现 typescript 5.0 之后加了 const Type Parameters,利用该特性对所有的 tag 和对引用该 tag 的地方做了泛型推导,对于非法的 tag 会报错提示,最终完成了这个 feature,也算做了一次相当复杂类型体操

README 中的两种使用方法应该用哪一种?

如果你有现成的 js/ts 环境,推荐使用 typescript

JSON Schema 是从 typebox 中生成的,它只支持基本的字段提示功能,但是作为一种低成本的使用方式,可用于快速体验 typebox 的一部分功能

Feature MatrixJSON SchemaTypeScript
Auto complete✔️✔️
Modular✔️
Tag check✔️

Edit page
Share this post:

Previous Post
STUN Protocol
Next Post
Render Test