Wener Site

typebox

约 2 分钟阅读
  • Json Schema Type Builder with Static Type Resolution for TypeScript
    • 构建的结果是 JsonSchema
    • 同时提供 TypeScript 类型定义
  • 非常 Declarative
  • 适用于标准类型定义,不适用于带转换逻辑和自定义 transform 场景
    • 例如 Date <-> string
  • 需要转换逻辑使用 zod
  • Type.Date, Type.RegExp 之类的使用了自定义 type
    • 导致生成的 jsonschema 是无效的
    • ajv 无法扩展 type
  • Value.Cast 会自动创建默认值
    • Date 会使用 now
    • 类型不匹配会丢掉
  • string -> number
    • 使用 Value.Convert
  • Value.Default 的返回结果不要修改
    • 可能会修改到 schema 上的 default
  • 对 format 支持较少
    • 没有 date, time 等
    • FormatRegistry.Set('date', value=>true)
      • 允许未知 format
    • 推荐使用 ajv-formats
    • Type.Date 得到的 {type:"Date"} 与 ajv 不兼容,ajv 不支持扩展 type
    • sinclairzx81/typebox#856GitHub Issuesinclairzx81/typebox#856
TypeScript
const T = Type.Object(
  {
    n: Type.Number(),
    d: Type.Date(),
    a: Type.Object(
      {
        b: Type.Array(Type.String(), { default: [] }),
      },
      { default: {} },
    ),
  },
  {
    // additionalProperties: false,
  },
);

// 约等于 zod 的 parse
console.log(
  // get T, run transform
  Value.Decode(
    T,
    // remove additional
    Value.Clean(
      T,
      // add missing
      Value.Default(
        T,
        // '1' -> 1
        Value.Convert(T, {
          z: 1,
          n: '1',
          d: new Date(),
        }),
      ),
    ),
  ),
);
  • Type.Composite
    • 🌟 推荐
    • A extends B
    • 得到单个合并的 schema
  • Type.Intersect
    • A & B
    • 得到 allOf schema

codegen

TypeScript
/**
 * @type: string
 * @format: "date-time"
 */
type JsonDateTime = Date | string;

interface Message {
  /**
   * @type: string
   * @format: "date-time"
   */
  date?: Date | string;
  // 折衷方案
  date2?: JsonDateTime;
}

关联信息

反向链接和本文引用的外部资料。

References

GitHub

6 条

其他外链

2 条
最近更新commit 74bb443Edit

On this page