2012-11-10 14 views
20

我有以下的C#類:我可以創建TypeScript類型並在AJAX返回JSON數據時使用它嗎?

public class JsonBackup 
{ 
    public int Added { set; get; } 
    public int DEVCount { set; get; } 
    public int DS1Count { set; get; } 
    public IList<ViewEvent> Events { get; set; } 
    public IEnumerable<string> Errors { set; get; } 
    public int Rejected { set; get; } 
    public bool Success { set; get; } 
    public int Updated { set; get; } 
} 

與此代碼JSON數據返回給我的瀏覽器:

return Json(new JsonBackup 
{ 
    Added = added, 
    DEVCount = devCount, 
    DS1Count = ds1Count, 
    Events = t.Events, 
    Rejected = rejected, 
    Success = true, 
    Updated = updated 
}); 

的數據在這裏返回:

$.ajax("/Backup/Data/Backup", 
    { 
     cache: false, 
     dataType: 'json', 
     type: 'POST' 
    }) 
.done(function (data:) { 
    console.log(data); 
    backupDone(data, ajaxElapsed); 
}); 

,並在使用其他地方也在這裏:

$.each(data.Events, function (i, item) { 
     $("#stats-list li:eq("+(4+i)+")").after('<li>' + item.Description + ' : ' + item.Elapsed + ' ms</li>'); 
    }); 

是否有可能對我來說,創造一個打字稿類型和數據分配到該類型的,所以我可以 選擇這樣的事情時,如

data.Added or data.DEVCount etc? 

回答

35
實現這一

最簡單的方式,例如讓智能感知爲IJsonBackup創建界面當您收到JSON只投它IJsonBackup

interface IViewEvent 
{ 
} 

interface IJsonBackup 
{ 
    Added : number; 
    DEVCount : number; 
    DS1Count : number; 
    Events : IViewEvent[]; 
    Errors : string[]; 
    Rejected : number; 
    Success : bool; 
    Updated : number; 
} 

在你的類定義:

backupDone(data: IJsonBackup, ajaxElapsed: any) 
{ 
} 

$.ajax("/Backup/Data/Backup", 
    { 
     cache: false, 
     dataType: 'json', 
     type: 'POST' 
    }) 
    .done(function (data: any) { 
     console.log(data); 
     backupDone(<IJsonBackup>data, ajaxElapsed); 
    }); 
+0

我anticip在這裏吃了一個大問題。如果服務器以字符串形式發送數字會怎樣?如果我們不顯式調用'parseFloat',那麼我們得到的是字符串而不是數字。如果他們互相加在一起,他們最終會連接起來,而不是像30 + 42 = 3042。想象一下,你試圖計算一個平均值,並且他們錯誤地添加了。而編譯時類型檢查只會讓它變得更糟,因爲你確定它們是數字,但它們不是。這將導致難以追蹤的錯誤。 – Gherman

+0

是的,這可能是一個問題,我同意。國際海事組織在這種情況下,我們負責所有需要的解析,然後再進一步傳遞數據,只有這樣做,我們才能安全地引入接口類型安全。打字稿不會自己解決這個問題,它不是正確的工具:)。這也是一個更一般的應用,它不僅僅與TS有關 - 如果數據以不同的表示形式出現,我們應該始終將數據解析爲預期的格式。 – Slawek

+0

大多數靜態類型的語言都可以保證函數參數真的是所選擇的確切類型。 Typescript不保證100%。這是因爲ts類型是可選的,它必須與無類型的js代碼兼容。 – Gherman

相關問題