Bookshelf.js 与相关的 TypeScript 错误

Posted

技术标签:

【中文标题】Bookshelf.js 与相关的 TypeScript 错误【英文标题】:Bookshelf.js withRelated TypeScript error 【发布时间】:2020-12-31 05:01:12 【问题描述】:

因此,在我的应用中,我有相互关联的类别文章。一开始我检索了所有的categories,每个里面都有articles。问题是我想通过userId 过滤其中的 categoriesarticles 但我不知道该怎么做,因为我正在使用 TypeScript 并出现错误。

const articlesInCategories = (await (await ArticleCategory.fetchAll())
    .query((qb: QueryBuilder) => 
        qb.innerJoin(Table.ARTICLE_CATEGORY_RELATION, 'article_category_relation.category_id', 'article_category.id' );
        qb.innerJoin(Table.ARTICLE, 'article.id', 'article_category_relation.article_id');

        // Next condition is only for Categories not for Articles inside it
        if (roleId == Role.manager) 
            qb.where('user_id', userId);
        

        qb.orderBy('id', 'desc');
      )
      .fetch(
          withRelated: ['articles': function (qb: QueryBuilder) => qb.where('user_id', userId)]
      ));

如果userId 例如是1,则只想获取那些类别,其中包含由ID为1的用户撰写的文章。此外,并非所有文章,而是仅由 ID 为 1 的用户撰写。

withRelated 附近有 TS 错误:Type ' articles: (qb: QueryBuilder) => QueryBuilder<any, any[]>; ' is not assignable to type 'string'.ts(2322)

在这种情况下你能帮我用 TypeScript 吗?或者建议任何替代方法来实现我想要的?

【问题讨论】:

【参考方案1】:

嗯,那是错误的方法。如果我执行以下操作,效果会非常好:

const articlesInCategories = await new ArticleCategory().query((qb: QueryBuilder) => 
    .query((qb: QueryBuilder) => 
        qb.innerJoin(Table.ARTICLE_CATEGORY_RELATION, 'article_category_relation.category_id', 'article_category.id' );
        qb.innerJoin(Table.ARTICLE, 'article.id', 'article_category_relation.article_id');

        if (roleId == Role.manager) 
            qb.where('user_id', userId);
        

        qb.orderBy('id', 'desc');
      )
      .fetch(
          withRelated: [ 'articles': (qb: QueryBuilder) => qb.where('user_id', userId) ]
      ));

【讨论】:

以上是关于Bookshelf.js 与相关的 TypeScript 错误的主要内容,如果未能解决你的问题,请参考以下文章

与 bookshelf.js 的多个多对多关系

Bookshelf.js / Knex.js 嵌套在单个查询中的位置

通过 Bookshelf.js 流式传输数据

Bookshelf.js/Knex.js 对 UTC DATETIME 列太“有用”

为啥我们需要 bookshelf.js 的 fetch() 方法中的新对象?

bookshelf.js 时间戳不起作用