A função inject do Angular oferece tipos mais precisos e melhor compatibilidade com decorators padrão, comparada à injeção baseada em constructor.
Este schematic converte a injeção baseada em constructor em suas classes para usar a função inject em vez disso.
Execute o schematic usando o seguinte comando:
ng generate @angular/core:inject
Antes
import { Component, Inject, Optional } from '@angular/core';import { MyService } from './service';import { DI_TOKEN } from './token';@Component()export class MyComp { constructor( private service: MyService, @Inject(DI_TOKEN) @Optional() readonly token: string ) {}}
Depois
import { Component, inject } from '@angular/core';import { MyService } from './service';import { DI_TOKEN } from './token';@Component()export class MyComp { private service = inject(MyService); readonly token = inject(DI_TOKEN, { optional: true });}
Opções de migração
A migração inclui várias opções para customizar sua saída.
path
Determina qual subcaminho em seu projeto deve ser migrado. Passe . ou deixe em branco para
migrar o diretório inteiro.
migrateAbstractClasses
O Angular não valida que parâmetros de classes abstratas são injetáveis. Isso significa que a
migração não pode migrar de forma confiável para inject sem arriscar quebras, razão pela qual elas estão
desabilitadas por padrão. Habilite esta opção se você quiser que classes abstratas sejam migradas, mas note
que você pode ter que corrigir algumas quebras manualmente.
backwardsCompatibleConstructors
Por padrão, a migração tenta limpar o código o máximo possível, o que inclui deletar parâmetros do constructor, ou até mesmo o constructor inteiro se ele não incluir nenhum código. Em alguns casos, isso pode levar a erros de compilação quando classes com decorators do Angular herdam de outras classes com decorators do Angular. Se você habilitar esta opção, a migração gerará uma assinatura de constructor adicional para mantê-lo compatível com versões anteriores, às custas de mais código.
Antes
import { Component } from '@angular/core';import { MyService } from './service';@Component()export class MyComp { constructor(private service: MyService) {}}
Depois
import { Component } from '@angular/core';import { MyService } from './service';@Component()export class MyComp {private service = inject(MyService);/\*_ Inserted by Angular inject() migration for backwards compatibility _/constructor(...args: unknown[]);constructor() {}}
nonNullableOptional
Se a injeção falha para um parâmetro com o decorator @Optional, o Angular retorna null, o que
significa que o tipo real de qualquer parâmetro @Optional será | null. No entanto, como decorators
não podem influenciar seus tipos, há muito código existente cujo tipo está incorreto. O tipo é
corrigido em inject(), o que pode causar novos erros de compilação aparecerem. Se você habilitar esta opção,
a migração produzirá uma asserção não-nula após a chamada inject() para corresponder ao tipo antigo,
às custas de potencialmente esconder erros de tipo.
NOTA: asserções não-nulas não serão adicionadas a parâmetros que já estão tipados como anuláveis, porque o código que depende deles provavelmente já leva em conta sua anulabilidade.
Antes
import { Component, Inject, Optional } from '@angular/core';import { TOKEN_ONE, TOKEN_TWO } from './token';@Component()export class MyComp { constructor( @Inject(TOKEN_ONE) @Optional() private tokenOne: number, @Inject(TOKEN_TWO) @Optional() private tokenTwo: string | null ) {}}
Depois
import { Component, inject } from '@angular/core';import { TOKEN_ONE, TOKEN_TWO } from './token';@Component()export class MyComp { // Note the `!` at the end. private tokenOne = inject(TOKEN_ONE, { optional: true })!; // Does not have `!` at the end, because the type was already nullable. private tokenTwo = inject(TOKEN_TWO, { optional: true });}