2014-07-16 82 views
0

這裏是我的財產,其中的接口定義多次:我可以爲一次對象的每個屬性定義一個接口嗎?

ExamStatusId = { 
     All: <IEnumElement>{ 
      id: this.examStatusSelectId, 
      text: 'Exam Status: All', 
      val: 0 
     }, 
     Current: <IEnumElement>{ 
      id: this.examStatusSelectId, 
      text: 'Exam Status: Current', 
      val: 1 
     } 
    } 

下面是我的界面:

interface IEnumElement { 
    elem: string; 
    text: string; 
    val: number 
} 

有什麼辦法,我能避免每個屬性後指定接口ExamStatusId的?

回答

1

您沒有包含elem屬性,所以您需要這樣做(儘管這是切線)。

我的建議是,你擁抱類型推斷的奇蹟,而做到這一點:

interface IEnumElement { 
    elem: string; 
    text: string; 
    val: number 
} 

class Exam { 
    private examStatusSelectId: number; 

    ExamStatusId = { 
     All: { 
      id: this.examStatusSelectId, 
      elem: '', 
      text: 'Exam Status: All', 
      val: 0 
     }, 
     Current: { 
      id: this.examStatusSelectId, 
      elem: '', 
      text: 'Exam Status: Current', 
      val: 1 
     } 
    } 
} 

// This function must be passed an IEnumElement 
function example(element: IEnumElement) { 

} 

var exam = new Exam(); 

// The compiler knows this is good 
example(exam.ExamStatusId.All); 

如果未包含正確的屬性,當你宣佈你的班ExamStatusId屬性,編譯器會正確發現問題,並告訴你這件事,因爲它會在ExamStatusIdIEnumElement接口比較常見的最佳類型(所以,即使你只錯過了elem掉一個,你會得到警告。

1

是的,這是可能的一個額外的接口,如下面的代碼。通用的IIndexable接口使其在不同的地方也很容易使用!

interface IEnumElement { 
    elem: string; 
    text: string; 
    val: number 
} 

interface IIndexable<T> { 
    [index: string]: T; 
} 

var ExamStatusId: IIndexable<IEnumElement> = { 
    All: { 
     elem: "", 
     text: 'Exam Status: All', 
     val: 0 
    }, 
    Current: { 
     elem: "asdf", 
     text: 'Exam Status: Current', 
     val: 1 
    }, 
    X: {} // this is now an error! 
} 

編輯:關於使用接口的好處是,你也會得到自動補全!

+0

這個問題是他失去* TestStatusId有效成員*的訪問權限。這些應該只是全部,當前或他明確鍵入的任何其他 – basarat

0

取決於你如果你的目的是爲了得到智能感知+輸入訪問對象的成員檢查時,如下圖所示:

enter image description here

你想要的智能感知+類型檢查創建個人會員時:

enter image description here

然後你所擁有的解決方案是我能想到的最好的解決方案。

相關問題