
Effect Model.BooleanSqlite为 SQLite 布尔列提供 0|1 与 boolean 双边界编码的模型字段【免费下载链接】effectBuild production-ready applications in TypeScript项目地址: https://gitcode.com/GitHub_Trending/ef/effect本文围绕 Effect 仓库中的变更记录 bright-dogs-fail.md 展开该 changeset 声明为effect包新增了一个 patch 级 API——Model.BooleanSqlite一个数据库变体使用0 | 1编码、JSON 变体使用原生boolean编码的模型字段模式。读完本文你将理解它在 Effect 4.0 的Model变体模型体系中的定位、底层BooleanFromBit编解码的实现细节以及如何在你自己的模型中正确使用它并通过测试验证。变更记录本身说了什么该 changeset 文件位于 .changeset/pre/bright-dogs-fail.md正文只有一句话AddModel.BooleanSqlite, a model field schema that uses0 | 1encoding for database variants and plainbooleanencoding for JSON variants.即新增Model.BooleanSqlite——一个模型字段模式model field schema其中数据库变体select/insert/update使用0 | 1的位编码JSON 变体json/jsonCreate/jsonUpdate使用普通boolean编码。这一变更对应 packages/effect/CHANGELOG.md 中记录的条目PR #1622并属于 Effect v4 中Model模块since 4.0.0的一部分。迁移文档 migration/v3-to-v4.md 还给出了相关的版本对照说明v3 时代的Model.BooleanFromNumber对应 v4 的核心 schemaBooleanFromBit而Model.BooleanSqlite则是「开箱即用的模型字段」形态。为什么需要它变体模型的基本问题SQLite 没有原生布尔类型布尔值通常以整数列0 | 1存储而面向 HTTP API 的 JSON 表示则应当是true | false。在 Effect 4 的模型体系中一个字段在不同操作边界读取数据库、写入数据库、对外输出 JSON可能需要不同的编码形态。Model模块正是为此设计的。从 packages/effect/src/unstable/schema/Model.ts 可以看到模型模式基于VariantSchema工厂生成固定提供六个变体const { Class, Field, FieldExcept, FieldOnly, Struct, Union, extract, fieldEvolve } VariantSchema.make({ variants: [select, insert, update, json, jsonCreate, jsonUpdate], defaultVariant: select })每个字段通过Field({ ... })按变体名声明各自的 schema未声明的变体中该字段被整体省略。这样Group.insert就只包含需要用户提供的字段Group.json就只暴露应当对外可见的字段且每个变体都是独立可校验、可编解码的 schema。BooleanSqlite 的源码实现BooleanSqlite定义在 packages/effect/src/unstable/schema/Model.ts其类型与构造实现为export interface BooleanSqlite extends VariantSchema.Field{ readonly select: Schema.BooleanFromBit readonly insert: Schema.BooleanFromBit readonly update: Schema.BooleanFromBit readonly json: Schema.Boolean readonly jsonCreate: Schema.Boolean readonly jsonUpdate: Schema.Boolean } {} export const BooleanSqlite: BooleanSqlite Field({ select: Schema.BooleanFromBit, insert: Schema.BooleanFromBit, update: Schema.BooleanFromBit, json: Schema.Boolean, jsonCreate: Schema.Boolean, jsonUpdate: Schema.Boolean })可以清晰地看出它对六个变体的完整覆盖变体schema编码形态selectSchema.BooleanFromBit0 \| 1insertSchema.BooleanFromBit0 \| 1updateSchema.BooleanFromBit0 \| 1jsonSchema.Booleantrue \| falsejsonCreateSchema.Booleantrue \| falsejsonUpdateSchema.Booleantrue \| false也就是说解码数据库行时接受0 | 1并映射为boolean编码回数据库时把boolean映射回0 | 1而在 JSON API 边界上完全使用原生布尔不做任何位转换。底层编解码BooleanFromBit数据库侧的Schema.BooleanFromBit定义在 packages/effect/src/Schema.tsexport const BooleanFromBit: BooleanFromBit Literals([0, 1]).pipe( decodeTo( Boolean, SchemaTransformation.transform({ decode: (bit) bit 1, encode: (bool) bool ? 1 : 0 }) ) )其文档注释明确了语义边界解码只接受字面量0或11映射为true、0映射为false编码时true映射为1、false映射为0。注意这是严格校验——传入2、1等值会触发解码失败而不是宽松地把「任意真值」当作布尔。这与 SQLite 中「整数列存布尔」的常见约定一致列里应当只出现0和1。实际使用在模型中声明与验证Model.BooleanSqlite与Model.Struct/Model.Class组合使用。官方测试 packages/effect/test/unstable/schema/VariantSchema.test.ts 提供了可直接复制的完整示例验证了数据库与 JSON 两侧的编解码行为import { Schema } from effect import { Model } from effect/unstable/schema const User Model.Struct({ active: Model.BooleanSqlite }) const select Model.extract(User, select) // 数据库变体 const json Model.extract(User, json) // JSON 变体 Schema.encodeSync(select)({ active: true }) // { active: 1 } Schema.decodeSync(select)({ active: 0 }) // { active: false } Schema.encodeSync(json)({ active: true }) // { active: true } Schema.decodeSync(json)({ active: false }) // { active: false }这四行断言恰好对应 changeset 描述的两种编码select 变体编出1、解入0得到falsejson 变体则原样保持布尔。如果你使用Model.Class定义领域模型字段声明方式完全一致例如import { Model } from effect/unstable/schema class Post extends Model.ClassPost(Post)({ title: Schema.String, published: Model.BooleanSqlite, // DB 列为 0 | 1JSON 输出为 boolean createdAt: Model.DateTimeInsertFromDate }) {}此时Post即select变体用于读取数据库行Post.insert/Post.update用于写库载荷Post.json/Post.jsonCreate/Post.jsonUpdate用于 API 输入输出各变体中published的 TS 类型都是boolean只有落到数据库边界时才表现为0 | 1。与同类字段模式的对照Model模块中还有一批同样按「变体 × schema」声明的现成字段可帮助判断何时选用BooleanSqlite见 Model.tsGeneratedByDb(schema)字段仅出现在select/json数据库自增列插入时不可提供GeneratedByApp(schema)出现在数据库三变体与json但不出现在 JSON 创建/更新载荷Sensitive(schema)仅数据库变体可见所有 JSON 变体中整体省略如密码FieldOption(schema)所有变体可选数据库变体接受nullJSON 变体接受缺失键且解码为OptionBooleanSqlite所有变体都可见仅编码形态按边界区分。如果字段在数据库与 JSON 中的编码形态相同比如都是字符串直接写Schema.String即可BooleanSqlite专治「同一逻辑值、两种编码形态」的场景。小结这条 patch 变更记录对应的Model.BooleanSqlite是 Effect v4 变体模型体系中的一个小而完整的构件它以六个变体为粒度声明「SQLite 侧用0 | 1、JSON 侧用boolean」的编解码契约底层复用核心Schema.BooleanFromBit的严格字面量转换并配套了覆盖两侧编解码的测试用例。对于使用 SQLite 并通过 Effect 构建 API 的项目把它声明为模型字段后数据库行与对外 JSON 之间的布尔转换即由类型系统接管无需在每个读写点手写? 1 : 0。【免费下载链接】effectBuild production-ready applications in TypeScript项目地址: https://gitcode.com/GitHub_Trending/ef/effect创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考