Внезапно я получаю ошибку типа при использовании декоратора InjectRepository в NestJs. Эта ошибка возникает в каждом сервисе.
constructor(
private userRepository: UserRepository,
@InjectRepository(Workout) <--- Error
private workoutRepository: Repository<Workout>,
) {}
{
"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
}
}
Я получаю следующую ошибку: Невозможно разрешить сигнатуру декоратора параметра при вызове в виде выражения. Аргумент типа «неопределенный» не может быть присвоен параметру типа «строка | символ'.ts(1239)
Я действительно не знаю, почему это появляется.
У меня была эта ошибка ворса, вызванная использованием @Inject(forwardRef(() => Class))
.
Это можно решить, обновив @nestjs/common
до v9.3.0
.
Судя по всему, это проблема, появившаяся в TypeScript v5. «[это] вводит некоторое ужесточение проверки типов в декораторе».
Как работал 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) {}
}
Как видите, Inject
требует второго аргумента, который может быть либо symbol
, либо string
.
В NestJS v9.3.0 это решено в рамках этого объединенного PR: Декораторы параметров конструктора должны разрешать undefined в качестве типа ключа # 10959