Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我可以创建一个TypeScript类型并在AJAX返回JSON数据时使用它吗?_Javascript_Typescript - Fatal编程技术网

Javascript 我可以创建一个TypeScript类型并在AJAX返回JSON数据时使用它吗?

Javascript 我可以创建一个TypeScript类型并在AJAX返回JSON数据时使用它吗?,javascript,typescript,Javascript,Typescript,我有以下C#类课程: 此处返回数据: $.ajax("/Backup/Data/Backup", { cache: false, dataType: 'json', type: 'POST' }) .done(function (data: ) { console.log(data); backupDone(data, ajaxElapsed); }); 在其他地方和这里使用: $.each(dat

我有以下C#类课程:

此处返回数据:

 $.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>');
    });

实现这一点的最简单方法是为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);
    });
backupDone(数据:IJsonBackup,ajaxpeased:any)
{
}
$.ajax(“/Backup/Data/Backup”,
{
cache:false,
数据类型:“json”,
类型:“POST”
})
.完成(功能(数据:任何){
控制台日志(数据);
备份完成(数据、时间);
});

我预计这里会有一个巨大的问题。如果服务器以字符串形式发送数字怎么办?如果我们不显式调用
parseFloat
,那么我们得到的是字符串而不是数字。如果它们彼此相加,它们将以30+42=3042的方式连接起来。假设您试图计算一个平均值,但它们被错误地相加。编译时类型检查只会让情况变得更糟,因为您确定它们是数字,但它们不是。这将导致难以跟踪的bug。是的,这可能是一个问题,我同意。在这种情况下,在进一步向下传递数据之前,我们负责所有需要的解析,只有这样做了,我们才能安全地引入接口类型安全。Typescript本身无法解决此问题,它不是解决此问题的正确工具:)。这也是一个更一般的应用,它实际上不仅仅与TS相关-如果数据以不同的表示形式到达,我们应该始终将数据解析为预期的格式。大多数具有静态类型的语言可以保证函数参数确实是所选的那些确切类型。Typescript不保证100%。之所以会出现这种情况,是因为ts类型是可选的,并且必须与无类型的js代码兼容。当然,在任何语言中,如果您从“外部”接收到一些数据(如本例中从使用json响应的服务器接收),您都必须对其进行解析,直接或间接地确保正确的类型。您是否得到将类型“AxiosResponse”转换为类型“Ibaout”的
转换可能是错误的,因为两种类型都没有充分重叠。如果这是有意的,请先将表达式转换为“未知”。
在这种情况下会出现错误吗?
data.Added or data.DEVCount etc?
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);
    });