NestJs 类型错误 - “未定义”类型的参数不可分配给“字符串 | 类型”的参数 象征'

max*_*han 2 repository decorator typescript nestjs

在 NestJs 中使用 InjectRepository 装饰器时,突然出现类型错误。每个服务都会发生此错误。

 constructor(
    private userRepository: UserRepository,

    @InjectRepository(Workout) <--- Error
    private workoutRepository: Repository<Workout>,
  ) {}
Run Code Online (Sandbox Code Playgroud)
{
  "compilerOptions": {
    "module": "CommonJS",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "target": "es2017",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true,
    "skipLibCheck": true,
    "strictNullChecks": true,
    "noImplicitAny": true,
    "strictBindCallApply": true,
    "forceConsistentCasingInFileNames": true,
    "noFallthroughCasesInSwitch": true,
    "resolveJsonModule": true
  }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误: 作为表达式调用时无法解析参数装饰器的签名。“未定义”类型的参数不可分配给“字符串|”类型的参数 符号'.ts(1239)

我实在不知道为什么会出现这个。

小智 5

我使用 时遇到了这个 lint 错误@Inject(forwardRef(() => Class))

可以通过更新@nestjs/common到 来解决v9.3.0

显然,这是 TypeScript v5 引入的问题。“[它]对装饰器类型检查进行了一些收紧。” 1

如何Inject运作:

export declare const Inject:
  (entity: Function) =>
    (target: object, key: string | symbol, index?: number) => void;

export class Foo {}

export class C {
  constructor(@Inject(Foo) x: any) {}
}
Run Code Online (Sandbox Code Playgroud)

如您所见,Inject需要第二个参数,即 asymbol或 a string

NestJS v9.3.0 在此合并 PR 下解决了这个问题:构造函数参数装饰器应该允许未定义作为键的类型 #10959