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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.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
为什么TypeScript允许这样做?_Typescript - Fatal编程技术网

为什么TypeScript允许这样做?

为什么TypeScript允许这样做?,typescript,Typescript,在TypeScript中,我发出了一个GET请求,该请求将生成一个JS对象,如下所示: //注意:变量实际上不是这样声明和硬编码的 //这只是为了演示接收到的对象的外观 设obj={id:“1”}; 我还有以下课程: 导出类测试{ 构造函数(公共id:number){} } 然后,我创建此类的一个新实例,如下所示: 让aClass=新测试(对象id); 令我惊讶的是,这个实例创建得很好。起初我想“酷!它会自动将id转换为一个数字!”但事实并非如此,这让我有点困惑 console.log(a

在TypeScript中,我发出了一个GET请求,该请求将生成一个JS对象,如下所示:

//注意:变量实际上不是这样声明和硬编码的
//这只是为了演示接收到的对象的外观
设obj={id:“1”};
我还有以下课程:

导出类测试{
构造函数(公共id:number){}
}
然后,我创建此类的一个新实例,如下所示:

让aClass=新测试(对象id);
令我惊讶的是,这个实例创建得很好。起初我想“酷!它会自动将id转换为一个数字!”但事实并非如此,这让我有点困惑

console.log(aClass.id的类型);
显示id的类型为string。我固执地拒绝相信这一点,并试图:

console.log(aClass.id+=12);
正如我在这一点上应该预料到的,它在字符串后面附加了“12”


现在,我的问题是:为什么会发生这种情况,为什么不抛出一个错误?

问题是,Typescript类型在编译时应用

GET
请求中检索的数据将始终被视为
any
,除非您对此做些什么。因为Typescript无法确定数据的类型(可以是任何类型)

您可以做的是强烈地键入GET请求的返回。然后typescript会给你一个错误。但是警告,如果GET请求没有返回所需的数据,它不会给您错误

const data: {
  id: string,
} = GET();

// ...
对于验证,有一些插件可用,如


我建议您为每个GET请求定义接口,如:

interface GetUserR {
   users: {
     id: string,
     name: string,
   }[],
}

const users: GetUserR = await requester.GET('users');

通过这种方式,您可以自动完成,错误很容易发现,并且是不断发展的。如果您处理前端和后端,最好让您的后端发出这些接口。

前面提到的示例。顺便说一句,您不能将变量命名为
class
@Metoniem,这取决于您实际如何接收
obj
。如果您在这样的承诺中指定了它:
axios(…)。然后((响应:{id:number})=>{let o=newtest(response.id);})则TS不会引发异常,因为类型是正确的。请更新问题以包含真实示例。您是否仅在运行时看到此问题?(这是意料之中的,因为所有的打字都被删除了。)正如@Agney的例子所示,如果完全按照您所写的操作,它应该会失败。我认为让您困惑的是,Typescript将编译您的代码,即使它包含错误。编译过程中会收到警告,但不会引发任何运行时问题errors@Agney哎呀,太早了!修正了变量..嘿!谢谢你的回答。我想
问题是,Typescript类型在编译时应用。
已经足够回答我的问题了。我对TS相当陌生,我想我希望它能用一些额外的代码来编译,这些代码会对给定的参数进行类型检查。我确实可以处理正面和背面,因此我将相应地调整它们:)