歧视者
标记的联盟类型 超级结构 基于 JSON型号的 歧视者 类型.
import { boolean, Infer, enums, string, object } from 'superstruct';
import { discriminator } from '@birchill/discriminator';
const schema = discriminator('eventType', {
USER_CREATED: object({ id: string() }),
USER_PAYMENT_PLAN_CHANGED: object({
id: string(),
plan: enums(['FREE', 'PAID']),
}),
USER_DELETED: object({ id: string(), softDelete: boolean() }),
});
type SchemaType = Infer<typeof schema>;
// SchemaType =
// {
// eventType: "USER_CREATED";
// id: string;
// } | {
// eventType: "USER_PAYMENT_PLAN_CHANGED";
// id: string;
// plan: "FREE" | "PAID";
// } | {
// eventType: "USER_DELETED";
// id: string;
// softDelete: boolean;
// }
为什么?
-
如果您尝试使用上面的模型
union()对象和验证失败 获取错误如 :Expected the value to satisfy a union of ``object | object | object``, but received: [object Object]。 。 。 .使用
discriminator()错误如下:At path: value.name -- Expected a string with a length between ``0``and ``256`` but received one with a length of ``257``。 。 。 . -
更好的语义.
-
方便的翻译 JSON 类型防御器 应 这很有用.
规格
discriminator() 需要两个参数:
- 代表加标工会标记域的字符串 .
- 键是标记值和值是的对象
object(), (中文(简体) ),type(),或discriminator()结起.
如果你需要模拟一个没有其它属性的分支,只需使用一个
空 object() 或者说 type()。 。 。 .
这很重要,因为你正在表明 是否该分支是
允许在其上添加值( q)type())或不(object()) (中文(简体) ).
譬如说.
discriminator('action', {
signin: type({ email: string(), token: string() }),
signout: type(),
});
你会筑巢 discriminator() 类似对象 :
discriminator('result', {
success: discriminator('task', {
upload: type({
filename: string(),
}),
download: type({
filename: string(),
bytes: number(),
}),
}),
failure: type({
code: number(),
}),
});
// `Infer` here produces the type:
//
// {
// result: "success";
// task: "upload";
// filename: string;
// } | {
// result: "success";
// task: "download";
// filename: string;
// bytes: number;
// } | {
// result: "failure";
// code: number;
// }
发展中国家
大楼
pnpm build
测试
pnpm test
释放
pnpm release-it