TS中快速定义一个对象数组以及处理async await的异常

news2025/1/21 12:01:52

定义一个对象数组(即数组成员为对象,对象的属性为我们所约束)

方法一:接口字面量形式

export type Resource= {
	_id: string,
	personID: {
	  _id: string
	  age: string
	  identifier: string
	  name: string
	  nation: string
	  grade: string
	  schemeNum: string
	  organ: string
	  sex: string
	}
	gaintestPoint:string
	looktestPoint:string[]
	viocetsetPoint:string
	gameReview:string
	Addvice:string
  }
export type ResourceArray =Resource[]

 方法二:数组泛型字面量形式

 export type ReArray=Array<{
	_id: string,
	personID: {
	  _id: string
	  age: string
	  identifier: string
	  name: string
	  nation: string
	  grade: string
	  schemeNum: string
	  organ: string
	  sex: string
	}
	gaintestPoint:string
	looktestPoint:string[]
	viocetsetPoint:string
	gameReview:string
	Addvice:string
  }
>

或者你也可以这么写

索引签名的方式不能被推断为一个数组,因此不能用来约束数据

这是一种比较常见的约束数据的接口定义

// * 请求响应参数(不包含data)
export interface Result {
	resp_code: string;
	msg: string;
	status_code: 200

}

// * 请求响应参数(包含data)
export interface ResultData<T = any> extends Result {
	data: T;
}

 接下来我们请求数据可能会这样写,这是一种严格的数据约束,包括定义响应式数组push接口数据,如果这里没有传入泛型则会报错

let result = reactive<ReArray>([])
const getResult = async () => {
  const { data } = await http.get<ResultData<ReArray>>('/user/getpoints')
  result.length = 0
  result.push(...data  )
}

但这里我们没法处理接口报错的情况,比较常规的写法是try catch 这是一直非常啰嗦的写法,让我们的代码变丑,一种比较优雅的形式是引入await-to-js 

安装命令  npm i await-to-js --save

使用

import to from 'await-to-js';

接下来我们的写法就变成

let result = reactive<ReArray>([])
const getResult = async () => {
  
const [err,res] =await to<ResultData<Resource[]>>(http.get('/user/getpoints')) 
const {data} = res
result.push(...data  )
}

但这里事实上ts会帮我们类型推导出data有可能不存在

 这时候我们可以使用非空断言!

这样就不会报错了 

to返回的是一个数组

我们可以在if语句里判断err是否存在,从在再去处理逻辑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/408548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

contentEditable属性

前言 我们最常用的输入文本内容便是input与textarea&#xff0c;但是有一个属性&#xff0c;可以让我们在很多标签中&#xff0c;如div,table,p,span,body等&#xff0c;可以像input输入框一样&#xff0c;实现文本编辑&#xff0c;这便是contentEditable属性 contentEditabl…

【vue2】近期bug收集与整理01

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;记录博主在vue2中遇到过的坑&#xff0c;本文是博主的学习使用总结 目录 1登陆token的问…

【学姐面试宝典】前端基础篇Ⅴ——JS深浅拷贝、箭头函数、事件监听等

前言 博主主页&#x1f449;&#x1f3fb;蜡笔雏田学代码 专栏链接&#x1f449;&#x1f3fb;【前端面试专栏】 今天继续学习前端面试题相关的知识&#xff01; 感兴趣的小伙伴一起来看看吧~&#x1f91e; 文章目录什么是事件监听事件委托以及冒泡原理介绍一下 promise&#x…

uniapp 小程序嵌套H5开发总结

项目需求是在uniapp小程序项目中嵌套H5页面&#xff0c;H5返回小程序需要传值给小程序进行通信。 好,百度一查确实可以实现 用的uniapp提供的web-view&#xff08;https://uniapp.dcloud.io/component/web-view.html#web-view经验证实&#xff0c;做功能之前先看官网&#xff…

一天时间迅速准备前端面试|JavaScript——异步进阶

&#x1f308;本系列文章是博主精心整理的面试热点问题&#xff0c;吸收了大量的技术博客与面试文章&#xff0c;总结多年的面试经历&#xff0c;带你快速建立前端面试知识体系。抓住每一场面试的机会&#xff0c;知己知彼才能百战百胜&#xff01; 上期回顾 JS基础–异步 本系…

【中秋快乐】如何用three.js实现我的太空遐想3D网页

目录 创作背景 功能分解 创建3d地球 创建3d月球 创建3d小火箭

解决element-ui动态加载级联选择器默认选中问题(Cascader)

前言 最近在开发任务中碰到需要在新增和修改时使用动态加载级联选择器&#xff0c;但是当在修改时设置默认选中项&#xff0c;出现了后端数据返回较慢&#xff0c;导致无法选中和级联框选中了但input框不显示的问题&#xff0c;网上找到的方法也不是很有效&#xff0c;还得使用…

Vue - v-for 循环渲染多个 “重复“ 子组件(仅 ref 不同,this.$refs.xx 使用时依然能准确找到子组件)将子组件 ref 设为动态,这样每个子组件都是 “独立“ 的!详细教程

前言 本教程更多版本:uni-app | 微信小程序 我们会通过给组件绑定 ref 值,然后通过 this.$refs.xx 来获取这个组件上的方法和变量。 如果 在 v-for 中循环渲染组件(绑定固定 ref),那么这个 ref 就会 “一摸一样”,导致根本无法找到(this.$refs.xx 谁?), 要解决这个问…

【前端】vue模板语法知识了解一下,是不是只知道用element-ui组件?

vue写在前面Vue模板语法文本原始HTML属性开源Vue模板和主题框架集合BootstrapVueelement-ui最后总结写在前面 上一篇总结了在实操过程中如果遇到了nodejs版本的问题&#xff0c;我们该如何去解决的&#xff0c;还有就是总结了vue2和vue3生命周期的区别&#xff0c;如果感兴趣的…

【JavaScript】JS实用案例分享:动态生成分页组件 | 通过按键实现移动控制

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 &#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff08;源创征文一等奖作品&#xff09;&#xff1a;前端之行&#xff0c;任重道远&#xff08;来自大三学长的万字自述&am…

React 路由v6 - 超全详解

React router v6 路由 已经习惯了 v5 版本的路由 &#xff0c;那么 v6 版本的路由 该怎么应用呢&#xff1f; 文章目录React router v6 路由Ⅰ、路由 v6 (两种形式)Ⅱ、 动态路由Ⅲ、路由重定向Ⅳ、路由跳转 (两种形式)Ⅴ、路由懒加载Ⅰ、路由 v6 (两种形式) 方案一 &#xff…

JS原生——编写简易计算器

一个非常适合新手练习的小案例&#xff01;&#xff01;&#xff01; 使用JS的ES5语法HTMLCSS及企业级代码规范&#xff0c;方便后续良好的代码习惯养成&#xff01;&#xff01;&#xff01; 先来看一下样式吧&#xff01;&#xff01;&#xff01;&#xff08;后附代码&…

组件通信的6种方式

什么是组件通信 vue组件中关系说明: 如上图所示, A与B、A与C、B与D、C与E组件之间是父子关系&#xff1b; B与C之间是兄弟关系&#xff1b;A与D、A与E之间是隔代关系&#xff1b; D与E是堂兄关系&#xff08;非直系亲属&#xff09; 针对以上关系我们归类为&#xff1a; 父…

前端跨域解决方案

文章目录1.同源政策2.跨域解决方案2.1 CORS普通跨域请求&#xff1a;只需服务端设置Access-Control-Allow-Origin即可携带cookie跨域请求&#xff1a;前后端都需设置2.2 JSONP原理缺点数据格式jsonp跨域实现2.3 postMessage跨域2.4 WebSocket属性&#xff1a;事件&#xff1a;使…

vue3+vite:本地代理,配置proxy

一、项目&#xff1a;uniappvue3vitets 二、配置文件在vite.config.ts proxy: {/snow: { // 匹配请求路径&#xff0c;localhost:3000/snowtarget: https://www.snow.com/, // 代理的目标地址changeOrigin: true, // 开发模式&#xff0c;默认的origin是真实的 origin:localh…

压缩gltf/glb模型踩坑与解决 three.js DRACOLoader

前言 使用前端three.js加载3d模型过程中&#xff0c;往往会出现模型大小过大导致前端加载时间过长&#xff0c;降低用户体验。 本文所记录的是笔者在使用gltf-pipeline压缩3d模型中踩坑DRACOLoader与解决的一个过程。 所采用的three库版本为 ^0.138.2 解决方案与介绍 通过g…

31.JavaScript数组进阶,一网打尽数组操作函数slice、filter、map、reduce、some、every、find、splice

文章目录数组进阶元素删除&#xff08;对象方式&#xff09;splice()删除一个元素删除多个元素截断数组元素替换元素插入返回值负索引slice()concat()forEach()indexOf、lastIndexOf、includesfind、findIndexfiltermapsortreversestr.split()和arr.join()reduce、reduceRightA…

vue在html标签 {{}} 中调用函数的方法

目录 一、问题 1&#xff09;实现上述需求&#xff1a;有两种方式 2&#xff09;两种实现方式对比&#xff1a; 二、解决方法&#xff08;在html渲染时调用函数&#xff09; 三、总结 注&#xff1a;不想仔细看的&#xff0c;可以直接看有颜色的及代码哟 一、问题 1.在ht…

关于 HbuilderX 运行项目到手机,搜索不到手机解决

注意 本文内&#xff0c;我的 HbuilderX 安装目录都是在 D:\app 目录下&#xff0c;所有关于本文的操作文件都是在 HbuilderX 安装包内。 第一步&#xff1a;打开环境变量&#xff0c;找到系统变量&#xff0c;然后点击编辑。 第二部&#xff1a;配置 HbuilderX 的 adbs 目录…

JS中的位运算

目录 JS中的位运算 JS中的与运算 JS中的或运算 JS中的否&#xff08;非&#xff09;运算 计算机中负数的存储方式 JS中的异或运算 JS中位运算的应用场景 位的叠加&#xff08;开关&#xff09; JS中的位移运算 左位移 右位移 全右位移 首先了解一下什么是位运算 位…