2012-11-10 85 views
6

有沒有什麼辦法可以創建一個默認的接口對象?默認的接口對象

例子:

interface myInterface { 
    A: string; 
    B: string; 
    C: number; 
    D: CustomType; // A custom class 
} 

通常你會創建此接口的對象:

var myObj: myInterface = { 
    A: "", 
    B: "", 
    C: 0, 
    D: null 
} 

但是它會是很好,如果有一些語法糖做這樣的:

var myObj = new myInterface; 
// OR 
var myObj = default(myInterface); 

從我的研究,我還沒有找到一個方法來做到這一點;但我希望我錯過了一些東西。

回答

2

不,沒有。

一個接口聲明只存在於編譯時,所以只有在編譯時才這樣做。不幸的是,編譯器沒有提供任何語言結構來執行此操作,也沒有任何方法來擴展編譯過程。


解決此問題的一種方法是做一些代碼生成;添加一個創建具有正確結構的對象的函數。這種方法存在的問題是,您必須解析TypeScript代碼或一些特定於域的語言。

閱讀是這樣的:

<Definitions> 
    <Interface Name="myInterface"> 
     <Member name="A" type="string"/> 
     <Member name="B" type="string"/> 
     <Member name="C" type="number"/> 
     <Member name="D" type="CustomType"/> 
    </Interface> 
</Definitions> 

,併產生類似:

interface myInterface { 
    A: string; 
    B: string; 
    C: number; 
    D: CustomType; 
} 

function InitMyInterface(obj?: any): myInterface { 
    if (obj === undefined) obj = {}; 
    return { 
     A: obj.A === undefined ? "" : obj.A, 
     B: obj.B === undefined ? "" : obj.B, 
     C: obj.C === undefined ? 0 : obj.C, 
     D: obj.D === undefined ? null : obj.D, // or InitCustomType(obj.D) 
    }; 
} 
+0

Bummer我認爲這可能是這種情況=( –

+0

這將是一個很好的編譯器,儘管如果他們要添加typescript語法來做到這一點雖然。又名默認(myInterface)編譯成默認對象聲明。 –

14

您可以使用一個稍微不同的語法,並得到所有的類型檢查和智能感知。

interface IUserModel{ 
    Name: string; 
    Age: number; 
    Email: string; 
    IsActive: boolean; 
} 

var user = <IUserModel>{}; 

您創建一個空的用戶對象,但TypeScript編譯器仍在檢查對象上是否有有效的屬性,並且它仍提供代碼完成。

enter image description here

enter image description here

+0

這是解決方案,謝謝! –

+0

這應該是公認的答案! –

0

要完成@Matija你可以做一個太行,和你的IDE(例如Visual Studio代碼)自動完成它爲您提供:

var user = <IUserModel>{ 
    Name : "foo"; 
}; 

如果你想設置接口爲參數,這將有所幫助,所以這也是有效的(JQueryAjaxSettings是一個接口,jquery.d.ts的一部分可以通過tsd install jquery得到):

jQuery.ajax("foo/bar", 
    <JQueryAjaxSettings>{ 
     dataType:"json", 
     cache : true, 

    });