【发布时间】:2023-01-23 19:05:05
【问题描述】:
我们目前被我们项目的 ORM 部分的一些打字稿类型所阻止。出于一些遗留/模糊的原因,我们正在运行我们自己的。
我们现在需要的是能够正确键入模型的查询条件以说明关系。这是一个例子:
interface Model1{
id:string;
name:string;
childId:string;
}
interface Model1Relations{
child:Model2;
}
type Model1WithRelations = Model1 & Model1Relations;
interface Model2{
id:string;
name:string;
}
非常简单,Model1 使用 childId 作为 belongsTo 关系。我们有映射关系部分的中间接口。这允许我们使用基本接口进行插入和更新等,以及选择上的其他 Model1WithRelations。
当我们向查询添加一个 where 子句时,我们使用这样的对象定义它:{name:"Bob"}。使用 Partial 可以轻松完成输入。 (为简单起见,因为我们还允许使用 lowerThan、not equal、includedIn 等运算符)。
现在,我们(终于)在我们的查询中创建了原生连接,我们现在可以根据它们的关系搜索实体。如果我想获得以 Bob 为子级的 model1,我可以执行 {"child.name":"Bob"},但这不满足类型要求。
如果我们改用 Partial,如果我们像这样改变我们编写 where 的方式,我们就可以使类型工作:{child:{name:"Bob"}} 但我们认为这会使事情更难阅读和理解,考虑到与 AND 配对时条件会变得疯狂, OR 和几个不同的运算符,它们是通过传递一个已经像 {name:{like:"%bob%"}} 的对象来定义的
可行吗?我们可以实现我们正在寻找的东西吗?哪个将属性名称与其类型的属性名称连接起来?我发现很难相信这是可能的……所以如果不是,你会建议我们做什么,其他人在做什么?我看到大多数其他 ORM 只是没有严格地键入它们的条件,我们认为这会造成伤害。
【问题讨论】:
标签: typescript orm