2016-04-25 56 views
0

在我的Angular 2 - Typescript應用程序中,我有一個接口。如何正確設計其屬性設置在不同時間(Angular 2應用程序)的Typescript接口?

someType.ts

export interface SomeType { 
    attr1: string; 
    attr2: number; 
    attr3?: SomeType2 
} 

並使用SOMETYPE爲類型檢查的服務。

DataService.ts

import {SomeType} from './someType; 

export class DataService { 
    storedData: SomeType; 

    setFirstStepData(<data>){ 
     // here is where I'm not sure which is the right design choice 
     // storedData. ... 
    } 

    getData(stepNumber: number){ 
     switch(...) { 
      // ... 
     } 
    } 
} 

最後我會從服務中獲得實際的對象,以便所有屬性將設置特殊情況除外。但是,storedData(其中包含臨時的「內存中」數據)在多個組件中初始化。

正是我應該像這樣工作:

firstComponent設置storedData的attR1和attR2位通過DataService的。然後路由到secondComponent,它將通過DataService存儲attr3。最後,當所有的屬性都設置,數據被髮送到後端

我看到這裏有兩個可能的選擇:

  • 集SOMETYPE與所有可選屬性,除了那些我知道將被設置確定由第一個組件使用DataService並創建。那麼通過DataService的各種組件將設置storedData的各個屬性,因此不會給出類型錯誤。這似乎是一個可行的解決方案,但直接在的DataService一點點「扭曲」

  • ,而不是使用storedData我會用attR1位,attR2位等。然而,由於實際上SOMETYPE模型從後端匹配它聽起來不是一個很好的設計選擇

哪種解決方案是在設計水平更好?如果他們兩人都不夠好,那麼的權利/最適當的方式來做到這一點?

回答

2

我認爲問題是這個解決方案的核心。

接口設計爲實現來自不同的類,不會在運行時修改。而且,接口在運行時被擦除。實際上,裝飾器也不支持接口。

如果在創建服務時必須設置SomeType一次,則可以根據需要實現Interface設置方法/參數。

但是,如果您需要更改SomeType Dinamically,接口不是正確的選擇。在這種情況下,您可以使用工廠,根據需要返回您的對象初始化。

EDITED

這裏是一個工廠例如與您的代碼:

@Injectable() 
export class SomeTypeFactory { 
    getSomeType(attr1:string, attr2:number, attr3?:SomeType2){ 
     let someType = { 
      attr1, 
      attr2, 
      attr3 
     }; 
     return someType; 
    } 
} 

這是一個工廠服務。您可以將其注入要定義自定義someType的類中。

注入,並在構造草簽它之後constructor(private factory:SomeTypeFactory) {} ,你可以用它來initialite SOMETYPE:

this.someType = this.factory.getSomeType('a',1, /*Optional SomeType2*/); 

EDIT 2

如果你想使用SOMETYPE模型,你可以插入類SomeType在工廠:

import {Injectable} from "angular2/core"; 

class SomeType { 
    attr1: string; 
    attr2: number; 
    attr3: any; 
    constructor(attr1:string, attr2:number, attr3?:any) { 
      this.attr1 = attr1; 
      this.attr2 = attr2; 
      this.attr3 = attr3; 
     } 
    } 

@Injectable() 
export class SomeTypeFactory { 
    getSomeType(attr1:string, attr2:number, attr3?:any){ 
     return new SomeType(attr1,attr2,attr3); 
    } 
} 

希望這有助於;)

+0

感謝您的回答。你能否提供一個具體的例子來說明如何用工廠做到這一點?我在文檔中找不到太多 – dragonmnl

+0

有一個問題:是_SomeType_類型還是_any_類型的可選attr3屬性? –

+0

它是一個具有多個屬性的類(就像SomeType但具有不同的屬性)。我編輯的定義,使其更清晰 – dragonmnl

相關問題