gpt4 book ai didi

angular - 具有用户定义的 InjectionToken 的 DI 无法在启用 AOT 的情况下工作

转载 作者:太空狗 更新时间:2023-10-29 18:30:06 24 4
gpt4 key购买 nike

我有以下构造函数:

constructor(env: Env, private logger: Logger,
@Inject(MockEndpoints.TOKEN) @Optional()
private endpoints: MockEndpoints[]) {
// ...
}

它与 JIT 编译器一起按预期工作。但是在启用 AOT 编译器的情况下,它会产生构建错误:错误:无法解析/path/mock-backend.interceptor.ts 中 MockBackendInterceptor 的所有参数:([object Object],[object Object],?)。

token 对象定义如下:

export interface MockEndpoints {
handle(req: HttpRequest<any>): HttpResponse<any>;
}

export namespace MockEndpoints {
export const TOKEN: InjectionToken<MockEndpoints[]> =
new InjectionToken<MockEndpoints[]>('MockEndpoints');
}

我确信这完全符合文档的建议。有什么提示吗? ;)

编辑(作为对 Gunter 评论的回应):端点在同一模块中注册:

@NgModule({
providers: [
{ provide: HTTP_INTERCEPTORS, useClass: MockBackendInterceptor, multi: true },
{ provide: MockEndpoints.TOKEN, useClass: MockBackupService, multi: true },
{ provide: MockEndpoints.TOKEN, useClass: MockConfigurationService, multi: true }
]
})
export class MockBackendModule { }

最佳答案

终于找到原因了。

非常感谢用户 yurzuiGünter Zöchbauer 的评论,这有助于发现问题。

解决方案

如果(且仅当) token 常量在命名空间内声明,InjectionToken 的参数化类型(例如本例中的 MockEndpoints)不能是接口(interface)。因此,将其更改为抽象类就足够了。

export abstract class MockEndpoints {
handle(req: HttpRequest<any>): HttpResponse<any>;
}

export namespace MockEndpoints {
export const TOKEN: InjectionToken<MockEndpoints[]> =
new InjectionToken<MockEndpoints[]>('MockEndpoints');
}

从命名空间中提取 TOKEN 常量甚至更简单。

export interface MockEndpoint {
handle(req: HttpRequest<any>): HttpResponse<any>;
}

export const MOCK_ENDPOINT = new InjectionToken<MockEndpoint[]>('MockEndpoints');

请注意,命名空间名称与接口(interface)名称(在本例中为两个名称 MockEndpoints)相同这一事实没有任何意义。当 token 常量在不同名称的命名空间内声明时,它不能将接口(interface)用作参数化类型。

当然它也可以使用纯字符串 token 而不是使用 InjectionToken 接口(interface)。

此行为仅在使用 AOT 编译时发生。使用 JIT 在这两种情况下都没有问题。

关于angular - 具有用户定义的 InjectionToken 的 DI 无法在启用 AOT 的情况下工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48341592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com