复现
构造函数或 Handler 带参数,但编译产物既没有 design parameter metadata,也没有显式 @Inject() token:
src/app.module.ts
import { Command, Handler, Injectable, Module, createApp } from 'func'
@Injectable()
class ProjectService {}
@Command('inspect')
class InspectCommand {
constructor(private project: ProjectService) {}
@Handler()
run() {}
}
@Module({
commands: [InspectCommand],
providers: [ProjectService],
})
class AppModule {}
createApp(AppModule)这个错误是什么
func 知道参数位置,但无法确定应从 DI 容器请求哪个 token。details.target 给出 class 或方法,details.index 给出参数位置。
如何修复
class 类型注入应在实际构建使用的 TypeScript 配置中启用装饰器与参数元数据:
tsconfig.json
{
"compilerOptions": {
"emitDecoratorMetadata": true,
"experimentalDecorators": true
}
}接口、type-only 依赖或不希望依赖反射元数据的参数使用显式 token:
src/commands/inspect.command.ts
import { Inject, createToken } from 'func'
interface Project {
name: string
}
const PROJECT = createToken<Project>('PROJECT')
class InspectCommand {
constructor(@Inject(PROJECT) private project: Project) {}
}无论采用哪一种方式,都要在当前 Module 注册对应 Provider,并确保 imported Provider 已显式 export。