Подтвердить что ты не робот

Могу ли я создать тип 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>');
    });

Возможно ли создать тип TypeScript и назначить данные этому типу, чтобы я мог например, получить intellisense при выборе таких вещей, как

data.Added or data.DEVCount etc?
4b9b3361

Ответ 1

Простейший способ добиться этого - создать интерфейс для 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);
    });