【问题标题】:Sudden TypeORM FindConditions type errors突然出现 TypeORM FindConditions 类型错误
【发布时间】:2021-11-14 07:02:44
【问题描述】:

重新安装 node_modules 后,我的 NestJS 服务中突然出现 FindOneOptions/ObjectID 错误。

几分钟前正在建设良好。 让我想知道,这是代码错误还是打字错误?

使用“@nestjs/typeorm”:“^7.1.5”
这似乎正在使用 typeorm 0.2.35:
本地安装版本:0.2.35.
全局安装的 TypeORM 版本:0.2.37。

实际代码

async getOne(id: number, userId?: string, type?: XPType, currentUser?: User) {
    const options: FindConditions<XP> = {
        id
    };
    userId && (options.userId = userId);
    type && (options.type = type);

    const post = await XP.findOne(options); // <-- error
    ...

这是实际的错误:

No overload matches this call.
  Overload 1 of 3, '(this: ObjectType<XP>, id?: string | number | Date | ObjectID, options?: FindOneOptions<XP>): Promise<...>', gave the following error.
    Argument of type 'FindConditions<XP>' is not assignable to parameter of type 'string | number | Date | ObjectID'.
      Type 'FindConditions<XP>' is missing the following properties from type 'ObjectID': generationTime, equals, generate, getTimestamp, toHexString
  Overload 2 of 3, '(this: ObjectType<XP>, options?: FindOneOptions<XP>): Promise<XP>', gave the following error.
    Type 'FindConditions<XP>' has no properties in common with type 'FindOneOptions<XP>'.
  Overload 3 of 3, '(this: ObjectType<XP>, conditions?: FindConditions<XP>, options?: FindOneOptions<XP>): Promise<...>', gave the following error.
    Argument of type 'import("/Users/bracicot/dev/dev-server/dev-server/node_modules/typeorm/find-options/FindConditions").FindConditions<import("/Users/bracicot/dev/dev-server/packages/server-common/dist/entities/experience-post.entity").XP>' is not assignable to parameter of type 'import("/Users/bracicot/dev/dev-server/packages/server-common/node_modules/typeorm/find-options/FindConditions").FindConditions<import("/Users/bracicot/dev/dev-server/packages/server-common/dist/entities/experience-post.entity").XP>'.
      Types of property 'userId' are incompatible.
        Type 'string | import("/Users/bracicot/dev/dev-server/dev-server/node_modules/typeorm/find-options/FindOperator").FindOperator<string>' is not assignable to type 'string | import("/Users/bracicot/dev/dev-server/packages/server-common/node_modules/typeorm/find-options/FindOperator").FindOperator<string>'.
          Type 'FindOperator<string>' is not assignable to type 'string | FindOperator<string>'.
            Type 'import("/Users/bracicot/dev/dev-server/dev-server/node_modules/typeorm/find-options/FindOperator").FindOperator<string>' is not assignable to type 'import("/Users/bracicot/dev/dev-server/packages/server-common/node_modules/typeorm/find-options/FindOperator").FindOperator<string>'.
              Types have separate declarations of a private property '_type'.ts(2769)
const options: FindConditions<XP>

似乎与4241 有关,但不确定。我希望有人可以帮助我理解这一点。

【问题讨论】:

  • XP 的类型是什么?我和你一样使用 FindConditions 类型,但使用自定义存储库
  • 嘿@MicaelLevi 这是一个对数据建模的类。其中包含标准数据内容,例如 id、title 和许多其他内容。现在我已经将FindConditions&lt;XP&gt; 的所有实例更改为any。不知道这里发生了什么。

标签: javascript node.js typescript nestjs typeorm


【解决方案1】:

来自错误:

  1. Overload 3 是您正在尝试的,也是应该解决的,因为它是唯一一个包含 FindConditions 参数:(this: ObjectType&lt;XP&gt;, conditions?: FindConditions&lt;XP&gt;, options?: FindOneOptions&lt;XP&gt;): Promise&lt;...&gt;

  2. 进一步挖掘,以下内容之间存在差异:

    'string | import("/Users/bracicot/dev/dev-server/dev-server/node_modules/typeorm/find-options/FindOperator").FindOperator<string>'
    

    不能分配给类型

    'string | import("/Users/bracicot/dev/dev-server/packages/server-common/node_modules/typeorm/find-options/FindOperator").FindOperator<string>
    

    看起来你有两个包:

    1. dev-server
    2. server-common

    并且这些包括单独的node_modules/typeorm/find-options/FindOperator 实例,迫使您的编译器将它们视为不同的类型。这由最后一个错误语句支持; Types have separate declarations of a private property '_type'..

  3. 最后,我认为您应该合并使用的 node_modules。有几种方法可以做到这一点,我不会建议采用哪种方法,因为我认为这取决于我不知道的变量。然而,我想到的主要两种方法是

    1. 使用 monorepo 工具(我得到了相关的“monorepo 工具”)和/或包管理器(工作区模式下的 pnpm、npm/yarn)为您系统地解决了这个问题
    2. server-common(听起来像一个支持库)成为依赖项(特别是typeorm)的唯一包含者,或者将它们列为对等依赖项,以便包括server-common 在内的应用程序获得发言权它使用什么类型。

    编辑:

    1. 重读后,我也意识到错误发生在After reinstalling node_modules,所以第三种选择可能是通过严格指定不^~的依赖关系来简单地确保typeorm的一致版本, 或 x 符号在每个相关的 package.json 文件中使用完全相同的版本。

【讨论】:

  • 哇 @Martin Grönlund 感谢您提供如此详细而精彩的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 2023-03-27
  • 2020-10-13
  • 1970-01-01
相关资源
最近更新 更多