Search code examples
dependency-injectionangular9ngxs

Angular upgrade from 8 to 9, Can't resolve all parameters for any injectable


I recently upgrade form Angular 8 to Angular 9 and it appears that nothing can be dependency injected.

I've commented out so much code in my project to something as basic as the following:

// configuration.state.ts
@State<ConfigurationStateModel>({
  name: 'ConfigurationStateModel',
  defaults: defaultConfiguration,
})
export class ConfigurationState {

  constructor(
    //private configurationService: ConfigurationService,
    private configurationService: HeroService,
  ) { }

  // .. irrelevant code

}
//hero.service.ts
// generated by ng g s heroservice
import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class HeroService {

  constructor() { }
}

Errors with

Error: Can't resolve all parameters for ConfigurationState: (?).

at getUndecoratedInjectableFactory (core.js:17311)

at injectableDefOrInjectorDefFactory (core.js:17295)

at providerToFactory (core.js:17363)

at providerToRecord (core.js:17345)

at R3Injector.processProvider (core.js:17161)

at core.js:17122

at core.js:1400

at Array.forEach ()

at deepForEach (core.js:1400)

at R3Injector.processInjectorType (core.js:17118)


Solution

  • Apparently with NGXS, all States must be now decorated with the @Injectable().

    This does not work:

    @Injectable()
    @State<ConfigurationStateModel>({
      name: 'ConfigurationStateModel',
      defaults: defaultConfiguration,
    })
    export class ConfigurationState {
    

    but adding it after @State does:

    @State<ConfigurationStateModel>({
      name: 'ConfigurationStateModel',
      defaults: defaultConfiguration,
    })
    @Injectable()
    export class ConfigurationState {