Skip to main content

typebox

tip
  • Json Schema Type Builder with Static Type Resolution for TypeScript
    • 构建的结果是 JsonSchema
    • 同时提供 TypeScript 类型定义
  • 非常 Declarative
  • 适用于标准类型定义,不适用于带转换逻辑和自定义 transform 场景
    • 例如 Date <-> string
  • 需要转换逻辑使用 zod
caution
  • Value.Cast 会自动创建默认值
    • Date 会使用 now
    • 类型不匹配会丢掉
  • string -> number
    • 使用 Value.Convert
  • Value.Default 的返回结果不要修改
    • 可能会修改到 schema 上的 default
  • 对 format 支持较少
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

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

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