突发 TypeORM FindConditions 类型错误

Sudden TypeORM FindConditions type errors

重新安装后 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 有关,但不确定。我希望有人能帮助我理解这一点。

来自错误:

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

  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用过的。有几种方法可以做到这一点,我不会建议采用哪种方法,因为我认为这取决于我不知道的变量。然而,spring 在我看来主要的两种方法是

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

    编辑:

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