为什么TypeScript允许这样做?
在TypeScript中,我发出了一个GET请求,该请求将生成一个JS对象,如下所示:为什么TypeScript允许这样做?,typescript,Typescript,在TypeScript中,我发出了一个GET请求,该请求将生成一个JS对象,如下所示: //注意:变量实际上不是这样声明和硬编码的 //这只是为了演示接收到的对象的外观 设obj={id:“1”}; 我还有以下课程: 导出类测试{ 构造函数(公共id:number){} } 然后,我创建此类的一个新实例,如下所示: 让aClass=新测试(对象id); 令我惊讶的是,这个实例创建得很好。起初我想“酷!它会自动将id转换为一个数字!”但事实并非如此,这让我有点困惑 console.log(a
//注意:变量实际上不是这样声明和硬编码的
//这只是为了演示接收到的对象的外观
设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相当陌生,我想我希望它能用一些额外的代码来编译,这些代码会对给定的参数进行类型检查。我确实可以处理正面和背面,因此我将相应地调整它们:)