Suporte a dependências circulares
Novidades
forwardRef(() => Token)— adia a leitura da referência de classe para o momento do uso, resolvendo o caso em que um import circular entre módulos deixa o tokenundefinedna avaliação do decorator. Aceito em parâmetro de construtor, propriedade, parâmetro de método e também emtoken/useClassnoregister.
// b.service.ts
export class ServiceB {
@Inject(forwardRef(() => ServiceA)) a: ServiceA
}- Ciclos de resolução agora funcionam quando pelo menos um dos lados injeta por propriedade: o container expõe a instância parcial durante a construção (
a.b.a === a). Antes, qualquer ciclo estourava comRangeError: Maximum call stack size exceeded. CircularDependencyInjectionException(códigoCIRCULAR_DEPENDENCY) para o ciclo construtor ↔ construtor, com o caminho do ciclo na mensagem (ServiceA -> ServiceB -> ServiceA) em vez do estouro de pilha.- Novos exports:
forwardRef,resolveForwardRef,isForwardRef,ForwardReferencee o tipoDependencyTokenInput.
Correções de comportamento
- Import circular sem
forwardRefnão injeta maisnullsilenciosamente — passa a lançar exceção tipada apontando o parâmetro ou a propriedade. Parâmetro que nunca foi decorado continua recebendonull, como antes. - Token
undefinedem propriedade lançava umTypeErrorcru (Cannot read properties of undefined); agora lançaCircularDependencyInjectionException.getTokenName(undefined)deixou de estourar.
Nota de tipos
getInjectTokensParams e getInjectTokensProperties passam a devolver DependencyTokenInput (a metadata guarda o ForwardReference cru, sem desembrulhar). Quem precisar do token concreto aplica resolveForwardRef. É mudança apenas de tipo, sem alteração de runtime.