Pesquisa de site

typescript - Este construtor não é compatível com a Injeção de Dependência do Angular porque sua dependência no índice 0 da lista de parâmetros é inválida


No meu aplicativo Angular 9, eu tenho uma classe abstrata:

export abstract class MyAbstractComponent {
  constructor(
    protected readonly cd: ChangeDetectorRef,
  ) {
    super();
  }

  // ...
}

e um Componente estendendo-o:

@Component({
  // ...
})
export class MyConcreteComponent extends MyAbstractComponent {
  // ...
}

Tudo funciona bem, exceto os testes, onde recebo o seguinte erro:

Erro: Este construtor não é compatível com Injeção de Dependência do Angular porque sua dependência no índice 0 da lista de parâmetros é inválida. Isso pode acontecer se o tipo de dependência for um primitivo, como uma string, ou se um ancestral desta classe estiver sem um decorador do Angular.

Por favor, verifique se 1) o tipo do parâmetro no índice 0 está correto e 2) os decoradores Angular corretos estão definidos para esta classe e seus ancestrais.

Resposta #1

Demorei um pouco, mas depois de criar um novo aplicativo com o Angular 10.2.3, meu tsconfig.json base não tinha o

"emitDecoratorMetadata": true,

nas compilerOptions!

Depois de adicionar isso novamente ao tsconfig.json, o DI funcionou como esperado.

Resposta #2

Enfrentamos o mesmo problema ao migrar para a versão 9. No final, descobrimos que esquecemos de adicionar decorators a alguns componentes abstratos. A partir da v9, todas as classes que usam DI do Angular devem ter um decorator de classe do Angular.

Exemplo dos exemplos de compatibilidade do Ivy:

Antes :

export class DataService {
  constructor(@Inject('CONFIG') public config: DataConfig) {}
}

@Injectable()
export class AppService extends DataService {...}

Depois de :

@Injectable() // <--- THIS
export class DataService {
  constructor(@Inject('CONFIG') public config: DataConfig) {}
}

@Injectable()
export class AppService extends DataService {...}

Artigos relacionados