【问题标题】:Have some sort of "computed" properties in typescript interfaces?在打字稿接口中有某种“计算的”属性吗?
【发布时间】: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


    【解决方案1】:

    我不确定我是否完全理解您的问题,但您可以执行以下操作:

    type ModelRelationsConcatenated<T> = {
        [K in keyof T[keyof T] as `${Exclude<keyof T, symbol>}.${Exclude<K, symbol>}`]: T[keyof T][K];
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-29
      • 1970-01-01
      • 2020-01-06
      • 2019-04-03
      • 2021-08-13
      • 2014-07-17
      • 2021-12-04
      • 2021-05-10
      • 1970-01-01
      相关资源
      最近更新 更多