Javascript 如何避免不必要的类型检查,以及API responce中的类型的正确模式或行为是什么?

Javascript 如何避免不必要的类型检查,以及API responce中的类型的正确模式或行为是什么?,javascript,typescript,typescript-typings,Javascript,Typescript,Typescript Typings,我正在为后端应用程序使用一个typescript,我想这不是一件简单的事情。但在谷歌上搜索文章并没有给我带来任何信心 假设我从API端点收到一个答案,通常的模式是这样的: some_数组:[ {key:value}, {key:value}, {key:string | | number | | nested object} ] 数字键:12, string_键:“string” 正如您可能看到的,它不是100%静态的,有时在some_array字段中(成功时实际上是100%数组)几乎可以是对

我正在为后端应用程序使用一个typescript,我想这不是一件简单的事情。但在谷歌上搜索文章并没有给我带来任何信心

假设我从API端点收到一个答案,通常的模式是这样的:

some_数组:[
{key:value},
{key:value},
{key:string | | number | | nested object}
]
数字键:12,
string_键:“string”
正如您可能看到的,它不是100%静态的,有时在
some_array
字段中(成功时实际上是100%数组)几乎可以是对象值中的任何数据

…如果有机会,我可能会收到一个错误或类似的东西

好吧,typescript为类型带来了安全性,但我不明白,当我几乎可以从端点收到
任何
响应时,它怎么会安全呢

例如,以下两者之间的区别是什么:

api(如有)

//内部异步函数
const-api:any=wait-fetch('/endpoint');
//我应该手动检查response类型,以避免不正确的类型
如果(!api | |!Array.isArray(api.some_Array)| |!api.some_Array.length)返回
for(api.some_数组的常量文档){
//任何功能或行为
}
和作为预定义接口的api


接口APIREP={
some_数组:{[key:string]:any}[]
数字键:数字
字符串\u键:字符串
}
//内部异步函数
const-api:ApiResp=await-fetch('/endpoint');
//如果(api)。。。但我是否应该只检查api,因为api的接口是预定义的?
for(api.some_数组的常量文档){
//任何功能或行为
}
在第二个选项中,如果(!api | | |!Array.isArray(api.some | u Array)| |!api.some(u Array.length)返回
,那么我就不能再检查类型了,所有不正确的类型响应在编译到
js
代码后,在接收时都会抛出错误
?所以我可以只检查
api
的存在,比如
if(api)…


或者,例如,如果API的实际响应不适合
接口
,它仍然会尝试到达
for of
循环并在那里抛出错误?(因为在端点响应中没有像
some_array
这样的字段,这些字段会出现错误,例如:
{error:404}

Typescript不用于运行时类型检查。它是一个纯编译时类型系统,旨在减少在使用非静态类型语言编写时容易发生的编码错误。因此,“当我几乎可以从端点接收到任何响应时,我不认为它是安全的。”你把运行时安全和编译时安全搞错了

如果您希望运行时安全,并且从端点接收的对象变化很大,那么您需要“手动”处理这些变化的类型,使用类型检查,如
!Array.isArray(api.some_Array)
,或者使用zerkms在注释中建议的库,如
io ts

确定了接收到的类型后,您就可以将对象强制转换到某个静态typescript界面,这样您就可以“安全”地使用它们,也就是说,不会出现在运行代码之前不会出现的类型错误


实际上,一个好的API应该保证某种类型的一致性响应,您可以用typescript类型来表示。如果不能,那么这就不是typescript可以解决的问题类型。

typescript不用于运行时类型检查。它是一个纯编译时类型系统,旨在减少容易出错的编码错误所以当你说,“当我可以从端点接收到几乎所有的响应时,我看不出它是如何安全的”,你就把运行时安全和编译时安全搞错了

如果您希望运行时安全,并且从端点接收的对象变化很大,那么您需要“手动”处理这些变化的类型,使用类型检查,如
!Array.isArray(api.some_Array)
,或者使用zerkms在注释中建议的库,如
io ts

确定了接收到的类型后,您就可以将对象强制转换到某个静态typescript界面,这样您就可以“安全”地使用它们,也就是说,不会出现在运行代码之前不会出现的类型错误


事实上,一个好的API应该保证某种类型的一致响应,你可以用typescript类型来表示。如果没有,那么typescript就不能解决这种类型的问题。

我使用
io ts
在应用程序边缘(基本上是任何io)键入数据。我使用
io ts
在应用程序边缘键入数据(基本上是任何io)。