angular 2 中可以注入接口嗎?如何實現?


答:不能,因為TypeScript的接口是設計時的, JavaScript沒有接口。 TypeScript代碼​​從生成的JavaScript過程中消失。沒有任何接口類型信息可供Angular在運行時查找。

有兩個方案可以實現:

1、方案1:
最簡單的解決方案就是定義一個實現接口的抽象類。通常,無論如何你都需要一個抽象類。

定義接口:

import {Role} from "../../model/role";

export interface ProcessEngine {

     login(username: string, password: string):string;

     getRoles(): Role[];
}

抽象類:

import {ProcessEngine} from "./process-engine.interface";

export abstract class ProcessEngineService implements ProcessEngine {

    abstract login(username: string, password: string): string;

    abstract getRoles(): Role[];

}

實現類:

import { Injectable } from '@angular/core';
import {ProcessEngineService} from "./process-engine.service";

@Injectable()
export class WebRatioEngineService extends ProcessEngineService {

    login(username: string, password: string) : string {...}

    getRoles(): Role[] {...}

}

定義provider:

@NgModule({
      ...
      providers: [
        ...,
        {provide: ProcessEngineService, useClass: WebRatioEngineService}
      ]
})

2、方案2:Angular的官方文檔建議使用InjectionToken,類似於OpaqueToken。

Your interface and class:

export interface AppConfig {
   apiEndpoint: string;
   title: string;
}

export const HERO_DI_CONFIG: AppConfig = {
  apiEndpoint: 'api.heroes.com',
  title: 'Dependency Injection'
};

Define your Token:

import { InjectionToken } from '@angular/core';

export let APP_CONFIG = new InjectionToken<AppConfig>('app.config');

使用InjectionToken對象注冊依賴項提供程序

providers: [{ provide: APP_CONFIG, useValue: HERO_DI_CONFIG }]

你可以通過@Inject裝飾器將配置對象注入任何需要它的構造函數中:

constructor(@Inject(APP_CONFIG) config: AppConfig) {
     this.title = config.title;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM