请问一下在ts文件中请求回来的数据为什么解构data取里面的属性值就报错说没有该类型?

最近用 angular 必须在TS文件写,我想在返回来的数组对象增加一个新属性。
打个比方我平常增加属性 data.forEach(item => item.check = false),但是在TS文件说我 ITEM.check 不存在,那我该如何才能增加新属性。
还有一个问题问问大佬们,定义接口数据必须写到最深层吗,因为我每次想拿 data.item.source 就报错说没有该属性,但我定义了而且接口数组里面有。

这是数据结构TS图

这是请求图

报错图

我修改成功了,但我不理解res.data.data不是一个数组吗那为什么我写observable<Datum[]>加个[]就报错,写Datum就能,他不是一个数组类型吗

阅读 2.6k
3 个回答

反向推测,Datum 中有 _source,那么 law_data$ 应该是 Datum[] 类型,那么 res.data 就是 Data 类型,res 就是 LawData 类型

所以看你的 law_data$ 是怎么声明的。另外,如果 res 的类型确定,可以直接声明为 res: LawData


searchLawData 的返回类型是 Observable<LawData[]>,所以对它调用 subscribe 中的 res 应该是 LawData[] 而不是 LawData

另外,报错说 LawData[] 上不存在 _source,说明 item 的类型是 LawData[] 而不是 LawData,那么 law_data$: Observable<Datum> 是怎么回事?

我模拟了 searchLawData,可以看到如下类型推断:

image.png

如果把它的返回类型改一下,把数组类型改成单体类型,就比较符合你需要的逻辑

image.png

但这样改的话,如果 http 请求返回的真的是一个数组,那 subscribe 里面的逻辑应该会有问题,它应该是处理一个数组,而不是一个单体。如果是处理数组,就不存在 res.data.data 这样的属性取值,至少应该有 res.forEach() 或者 res.map() 之类对数组进行处理的逻辑。

接口处的ts 是对接口做的类型约束,之前正常是因为前后端定义好的参数已经约束好了。
你这大概率应该是现在新加参数但是你的接口返回值并没有在 ts 中增加新增的参数
image.png
第二个问题,并不是接口返回什么就定义什么,而是你需要什么就去定义什么无论层级多深,而且就算不会使 ts 最好还是学一下,尽量不要使用 any 否则 ts 还不如不用,如果你不写底层的东西其实很简单的,看到高级类型就差不多了,基本上写普通项目 type 定义就差不多。

所以你要先学一下Typescript啊.
当你学了TS,这些问题就不是问题了.现在你这样遇到一个问题提一个问题是行不通的,毕竟项目里面会遇到的问题太多了,至少先过一遍文档..
data.foreach(item=>item.check = false)但是在TS文件说我ITEM.check不存在
这个问题,因为你的data数据里面包含的对象,并未定义有check属性,对于data
如果你不方便定义任何对象作为类型,可以这样写定义他的类型
const data: Record<string,unknown>[] = [];

实际上应该总是尽量定义一个较为准确的类型,可以让程序更加健壮

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏