写出更优雅和稳健的 TS 代码的几个 tips
创始人
2024-05-03 01:40:28
0

写出更优雅和稳健的 TS 代码的几个 tips

本来想放优雅 太优雅了.jpg,后来还是好懒啊……

使用 unknown 代替 any

any 的问题在于它直接关闭了 TS 的类型检查,因此一旦使用了 any,那就代表任何事情都会发生。使用 unknown 则告诉 TS:在目前这个步骤我还不知道使用的数据类型,不过当我去使用该变量的时候,我就知道这个类型是什么了(多为类型检查)。

参考一下代码:

interface IUser {id: number;firstname: string;lastname: string;gender: string;image: string;age: number;
}interface IAdminUser extends IUser {token: string;addNewUser: () => void;
}const isAdmin = (object: unknown): boolean => {return true;
};const fetchUser = async () => {const res = await fetch('http://localhost:3000/users/1');// bad ❌const badUser = await res.json();console.log(badUser.nonExistingProp);// good ✅const goodUser: unknown = await res.json();console.log(goodUser.nonExistingProp);// add type guardif (isAdmin(goodUser)) {}
};

在这里插入图片描述

直接使用 any 的代码不会出现任何的报错,而使用 unknown 则是会强制要求进行类型检查才能继续。

使用 is

is 也是一种类型断言,稍微修改一下上面的代码中对 user 的检查:

const isAdmin = (object: unknown): object is IAdminUser => {if (object !== null && typeof object === 'object') {return 'token' in object;}return false;
};const isRegularUser = (object: unknown): object is IUser => {if (object !== null && typeof object === 'object') {return 'token'! in object;}return false;
};

在这里插入图片描述

在调用时,TS 就会遵从 object is IAdminUser,在返回值为 true 的时候断言返回类型为 IAdminUser,这时候 goodUser 中就会包含所有管理员权限应该有的属性和函数。

同理,如果检查下来用户不是管理员,那么该用户也就无法调用管理员才能使用的属性和函数:

在这里插入图片描述

另一种需要 is 的情况是 Union Type,Union Type 的定义也是 type 乱用的重灾区。

function isFish(pet: Fish | Bird): pet is Fish {return (pet as Fish).swim !== undefined;
}// Both calls to 'swim' and 'fly' are now okay.
let pet = getSmallPet();if (isFish(pet)) {pet.swim();
} else {pet.fly();
}const zoo: (Fish | Bird)[] = [getSmallPet(), getSmallPet(), getSmallPet()];
const underWater1: Fish[] = zoo.filter(isFish);
// or, equivalently
const underWater2: Fish[] = zoo.filter(isFish) as Fish[];// The predicate may need repeating for more complex examples
const underWater3: Fish[] = zoo.filter((pet): pet is Fish => {if (pet.name === 'sharkey') return false;return isFish(pet);
});

可能对于单独一个对象而已,使用 as 进行 type casting 问题不是很大,不过对于之后要重新声明的数组等,一直使用 as 去转确实挺麻烦的。不过有了现在这个方法,就可以忽略掉 as Type[] 这种声明了。

使用 satisfies 关键词

satisfies 是 4.9 新出的一个特性,已下面代码为案例:

interface ICustomImage {width: number;height: number;data: string;
}interface IUser {id: number;firstname: string;lastname: string;image: string | ICustomImage;
}const user: IUser = {id: 1,firstname: '',lastname: '',image: 'random url',
};

在这里插入图片描述

可以看到,尽管声明的是一个字符串,不过因为 union type 的关系,TS 无法明确认识 user.image 究竟是字符串还是对象,但是使用 satisfies 关键词之后则是另一个情况:

在这里插入图片描述

在这里插入图片描述

TS 能够更好的通过数据类型进行断言和提示。

正确使用 enum

这里指的是尽量不要使用默认的 enum 类型(即数字),如:

在这里插入图片描述

尽管 100 不在 State 中(默认应该从 0 开始,所以这里只有 0,1,2),但是传参时检查失败。不过使用字符串就可以避免这个问题了:

在这里插入图片描述

在这里插入图片描述

善用 Utility Type

这里提一个我刚找到能够很好的解决我目前一个 CRUD 操作的组合技:

interface IUser {id: number;firstname: string;lastname: string;gender: string;image: string;age: number;
}const updateUser = (userId: IUser['id'],updatedUser: Partial>
) => {};

在这里插入图片描述

这时候查看就能够发现,所有的选项已经变成了 optional,而 id 已经从可更新的状态中移除了。

Util Types真的还蛮有用的……不过我之前看的一些教程都没讲,晚点这块继续补一下吧。

参考

  • Using type predicates

相关内容

热门资讯

原生安卓系统怎样升级,从基础到... 你有没有发现,你的安卓手机用久了,有时候就像老牛拉车一样,慢吞吞的?别急,今天就来给你支个招,让你的...
安卓13系统怎么开发,开发者的... 你有没有听说安卓13系统已经发布了?这可是个大新闻呢!作为一个热衷于手机开发的小伙伴,你是不是也跃跃...
安卓q系统镜像下载,轻松升级体... 你有没有听说安卓Q系统已经发布了?这可是安卓家族里的一大亮点呢!今天,我就要来给你详细介绍一下安卓Q...
安卓系统色彩校正软件,打造个性... 你有没有发现,手机屏幕的色彩有时候会让人感觉不太对劲?有时候,画面看起来有点灰蒙蒙的,有时候又太艳丽...
苹果能否下个安卓系统,开启新篇... 你有没有想过,苹果的iOS系统会不会有一天突然宣布,它要拥抱安卓的大家庭呢?想象iPhone和iPa...
树莓派 装 安卓系统,轻松安装... 你有没有想过,用树莓派装上安卓系统,那会是怎样一番景象呢?想象一个迷你电脑,竟然能运行起我们日常使用...
安卓系统怎么打印小票,安卓系统... 你是不是也遇到了这样的烦恼:手机里存了好多重要的小票,但是想打印出来保存或者报销,却发现安卓系统里的...
安卓10安装系统应用,轻松上手... 你有没有发现,你的安卓手机最近是不是有点儿“慢吞吞”的?别急,别急,今天就来给你支个招——升级安卓1...
美国不提安卓系统华为,迈向自主... 华为与美国:一场关于技术、市场与政策的较量在当今这个数字化的世界里,智能手机已经成为我们生活中不可或...
安卓系统怎么打开ppt,选择文... 你有没有遇到过这种情况:手里拿着安卓手机,突然需要打开一个PPT文件,却怎么也找不到方法?别急,今天...
谷歌退回到安卓系统,探索创新未... 你知道吗?最近科技圈可是炸开了锅,谷歌竟然宣布要退回到安卓系统!这可不是一个简单的决定,背后肯定有着...
安卓系统待机耗电多少,深度解析... 你有没有发现,手机电量总是不经用?尤其是安卓系统,有时候明明没怎么用,电量就“嗖”的一下子就下去了。...
小米主题安卓原生系统,安卓原生... 亲爱的手机控们,你是否曾为手机界面单调乏味而烦恼?想要给手机换换“衣服”,让它焕然一新?那就得聊聊小...
voyov1安卓系统,探索创新... 你有没有发现,最近你的手机是不是变得越来越流畅了?没错,我要说的就是那个让手机焕发青春的Vivo V...
电脑刷安卓tv系统,轻松打造智... 你有没有想过,家里的安卓电视突然变得卡顿,反应迟钝,是不是时候给它来个“大保健”了?没错,今天就要来...
安卓系统即将要收费,未来手机应... 你知道吗?最近有个大消息在科技圈里炸开了锅,那就是安卓系统可能要开始收费了!这可不是开玩笑的,这可是...
雷凌车载安卓系统,智能出行新体... 你有没有发现,现在的汽车越来越智能了?这不,我最近就体验了一把雷凌车载安卓系统的魅力。它就像一个聪明...
怎样拍照好看安卓系统,轻松拍出... 拍照好看,安卓系统也能轻松搞定!在这个看脸的时代,拍照已经成为每个人生活中不可或缺的一部分。无论是记...
安卓车机系统音频,安卓车机系统... 你有没有发现,现在越来越多的汽车都开始搭载智能车机系统了?这不,咱们就来聊聊安卓车机系统在音频方面的...
老苹果手机安卓系统,兼容与创新... 你手里那台老苹果手机,是不是已经陪你走过了不少风风雨雨?现在,它竟然还能装上安卓系统?这可不是天方夜...