EN
← 错误索引

F_SYSTEM_MISSING_PARAM_TYPES

缺少参数类型元数据

运行时无法推断构造函数或 Handler 参数所请求的 Provider token。

更新于

复现

构造函数或 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。