9个提升TS编码能力的技巧【干货】🔥!

简介: 前言大家好,我是HoMeTown前段时间用TS做了一个线上标准的项目,也都提测了,最近可以抽时间来整理一下项目中用到的技术栈,( 我用前端【最新】技术栈完成了一个生产标准的项目【Vue3 + TS + Vite + Pinia + Windicss + NavieUI】。今天聊一聊TypeScript。

前言

大家好,我是HoMeTown

前段时间用TS做了一个线上标准的项目,也都提测了,最近可以抽时间来整理一下项目中用到的技术栈,( 我用前端【最新】技术栈完成了一个生产标准的项目【Vue3 + TS + Vite + Pinia + Windicss + NavieUI】。今天聊一聊TypeScript

背景

因为是一个EPR系统,项目中包含了大量的计算与字段 & 秉持着操手前端最新技术栈 的目标,果断选择了TypeScript,接下来,我就聊一下通过这个项目,我得到了哪些经验。

TypeScript

这个东西是什么,我就不过多阐述了,直接上干货!

构建一个类型的属性,书写类型要保持一致

举个🌰

// bad
type UppercaseRole = 'ADMIN' | 'User' | 'guest'
// good
type UppercaseRole = 'ADMIN' | 'USER' | 'GUEST'
type UppercaseRole = 'Admin' | 'User' | 'Guest'
type UppercaseRole = 'admin' | 'user' | 'guest'
复制代码

泛型

不要重复的创建类型,提升泛型的复用性,举个🌰

type Add<T> = (a: T, b: T) => T
const addNumbers: Add(number) = (a, b) => a + b
const addStrings: Add(string) = (a, b) => a + b
复制代码

在上述的🌰中,我们通过泛型,定义一个类型,传入不同的类型即可,不需要给每一个函数都写一个类型,节省精力,简化代码。

实用类型

Pick<Type, Keys>

Pick可以从现有的Type中挑选属性的集合 keys来创建一个新的类型,keys可以是一个字符串字面或者一个联合字符串。需要注意的是,Keys的值必须是Type的键。举个🌰

type UserInfo = {
    username: string;
    age: number;
    realname: string;
    email: string;
    phone: number;
    password: string;
}
// 使用Pick对你想提取的部分进行提取即可
type UserAccount = Pick<UserInfo, 'username' | 'password'>
复制代码

Omit<Type, Keys>

OmitPick相反,你传入的Keys变成了你想要去掉哪些属性。举个🌰

type UserInfo = {
    username: string;
    age: number;
    realname: string;
    email: string;
    phone: string;
    password: string;
}
// 使用Omit对你不想要的属性进行剔除
type UserDescInfo = Pick<UserInfo, 'username' | 'password'>
复制代码

Partial< Type>

Partial可以构造一个全都是可选属性的类型,具体的使用场景比如一些后端返回的无法具体确认的数据,举个栗子。

type OrderRowInfo = {
    orderId: number;
    orderCn: string;
    orderEn: string;
    orderDecs: string;
    remark: string;
}
type PartialOrderRowInfo = Partial<Type>
// 它其实返回之后就是 orderId?: number; orderCn: string; ...
复制代码

Required< Type>

RequiredPartial相反,举个栗子

type PartialOrderInfo = {
    orderId: number;
    orderCn: string;
    orderEn?: string;
    orderDesc?: string;
    remark?: string;
}
type RequireOrderInfo = Required(PArtialOrderInfo)
复制代码

Readonly< Type>

你可以理解 Readonly是定义变量时的const,只不过他是定义类型的。举个🌰

type User = {
    username: string;
}
type ReadOnlyUser = ReadOnly<User>
const user: ReadOnlyUser = {
    username: 'HoMeTown'
}
user.username = 'handsome boy' 
// Cannot assign to 'username' because it is a read-only property
复制代码

操作符

可选链 ?.

可选链的出现让我感觉是真的太香了,终于不用再做 && 这种操作了,有时候我们会处理一些深层及的obj,光做非空 !undefiend的判断就得写一堆堆,有了?.,妈妈再也不用担心我写不好了。

举个🌰

type DeptMember {
    memberName: string;
}
type UserInfo = {
    username: string;
    dept: {
        deptname: string;
        deptMembers: DeptMember[]
    }
}
const res = await fetchGetUserInfo(userId)
// before bad
if(res && res.data && res.data.userInfo && res.data.userInfo.dept && res.data.userInfo.dept.deptMembers) {
 // do something...
}
// now good
if(res?.data?.userInfo?.dept?.deptMembers) {
    // do something
}
复制代码

空值合并 ??

当左侧操作数为 nullundefined 时,其返回右侧的操作数。否则返回左侧的操作数,与逻辑或|| 操作符不同,逻辑或会在左操作数为 falsy 值时返回右侧操作数。也就是说,如果你使用 || 来为某些变量设置默认的值时,你可能会遇到意料之外的行为。比如为 falsy 值(’’、NaN 或 0)时,举个🌰

// 使用 ??
const tem = 0 ?? '---'; 
console.log(tem); // 输出:0
// 使用 ||
const tem = 0 || '---';
console.log(tem); // 输出:'---'
复制代码

假设我们在一个table组件中有某些数字类型的值需要展示,用||的话如果API返回的是0,那就展示错了。

逻辑空赋值 ??=

其实就是在进行 ?? 操作后,进行一个赋值的动作

userInfo.age ??= 26
复制代码

这些就是我在开发的过程中比较常用到的,可能还有一点,以后想起来再补充。

目录
打赏
0
0
0
0
82
分享
相关文章
阿里云×典名科技首场城市服务商招募会落地西安
9月20日,“阿里云×典名科技城市服务商招募会”在西安隆重召开,会上发布了城市服务商伙伴业务支持计划。该计划旨在深度宣传和落地“伙伴优先”战略,吸纳更多优秀合作伙伴加入阿里云生态。
【MATLAB 】 VMD 信号分解+希尔伯特黄变换+边际谱算法
【MATLAB 】 VMD 信号分解+希尔伯特黄变换+边际谱算法
1028 0
前端图形学实战: 从零实现编辑器的图层管理面板和实时缩略图(vue3 + vite版)
前端图形学实战: 从零实现编辑器的图层管理面板和实时缩略图(vue3 + vite版)
216 0
数字图像处理实验(五)|图像复原{逆滤波和伪逆滤波、维纳滤波deconvwnr、大气湍流扰动模型、运动模糊处理fspecial}(附matlab实验代码和截图)
数字图像处理实验(五)|图像复原{逆滤波和伪逆滤波、维纳滤波deconvwnr、大气湍流扰动模型、运动模糊处理fspecial}(附matlab实验代码和截图)
1406 0
数字图像处理实验(五)|图像复原{逆滤波和伪逆滤波、维纳滤波deconvwnr、大气湍流扰动模型、运动模糊处理fspecial}(附matlab实验代码和截图)
`pytest-qt` 是一个用于在 Qt 应用程序中进行 GUI 测试的 pytest 插件。
`pytest-qt` 是一个用于在 Qt 应用程序中进行 GUI 测试的 pytest 插件。
使用Python实现深度学习模型:智能语音助手与家庭管理
使用Python实现深度学习模型:智能语音助手与家庭管理
369 0
Vue3如何使用Pinia详细介绍、pinia持久化存储(pinia-plugin-persistedstate详细配置)
Vue3如何使用Pinia详细介绍、pinia持久化存储(pinia-plugin-persistedstate详细配置)
阿里云服务器配置选择指南2核4G、4核8G和8核16G性能全解析!
阿里云2核4G、4核8G与8核16G服务器配置解析及选择指南。根据不同业务需求,推荐ECS经济型e、通用算力型u1、计算型c7/c8i实例。企业用户专享2核4G ECS u1实例仅199元/年,自带5M带宽;4核8G u1实例起价955.58元/年;8核16G c7实例起价6544元/年。各实例CPU性能各异,如c7采用第三代Intel Xeon处理器,适配高性能计算场景。
623 10
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问