1

$get我正在尝试升级 AngularJS 服务提供者(TranslateProvider),它从它的函数返回一个接口的实例。

问题是,在 Angular 提供程序对象 (translateProvider) 中,该provide字段应该是Translate但不能使用,因为 TypeScript 接口仅用于编译时。这是我得到的错误:

TS2693: 'Translate' only refers to a type, but is being used as a value here.

这是源代码的要点:

export class TranslateProvider implements ng.IServiceProvider {

    public $get() {

        const service: Translate = <Translate> function translate(key: string, parameters: Dictionary<StringLike>): string {

        return service;
    }
}

export interface Translate {
    (translationKey: string, parameters?: Dictionary<StringLike>): string;
}

export function translateFactory(i: any) {
    return i.get('translate');
}

export const translateProvider = {
    provide: TranslateProvider,
    useFactory: translateFactory,
    deps: ['$injector']
};

@NgModule({
    imports: [
        BrowserModule,
        UpgradeModule,
    ],
    declarations: [
    ],
    providers: [
        translateProvider,
    ]
})
4

1 回答 1

1

我在Angular 文档中找到了关于 Injection Tokens 的解释

您需要在代码中的某处(通常在定义接口的文件中)添加

export const TRANSLATE_TOKEN = new InjectionToken<Translate>('Translate');

稍后可以使用此令牌向注入器请求此服务。

升级注册现在如下所示:

export const translateProvider = {
    provide: TRANSLATE_TOKEN,
    useFactory: translateFactory,
    deps: ['$injector']
};

最后,将使用此依赖项的组件的 ctor 如下所示:

constructor(@Inject(TRANSLATE_TOKEN) private translate: Translate) {
}
于 2017-09-03T13:21:31.957 回答