写出更优雅和稳健的 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

相关内容

热门资讯

安卓系统自带的网页,功能与特色... 你有没有发现,每次打开安卓手机,那熟悉的系统界面里总有一个默默无闻的小家伙——安卓系统自带的网页浏览...
美咖云系统安卓版,开启智能生活... 你有没有发现,最近手机上多了一个叫“美咖云系统安卓版”的小家伙?它就像一个魔法师,轻轻一点,就能让你...
安卓系统推荐最好的手机,盘点性... 你有没有想过,拥有一部性能卓越的手机,就像是拥有了移动的宝藏库?在这个信息爆炸的时代,一部好手机不仅...
安卓11系统能精简吗,释放潜能 你有没有发现,随着手机越来越智能,系统也越来越庞大?安卓11系统,这个最新的操作系统,是不是也让你觉...
安卓自动重启系统软件,揭秘原因... 手机突然自动重启,是不是感觉整个人都不好了?别急,今天就来和你聊聊这个让人头疼的安卓自动重启系统软件...
苹果手机x刷安卓系统,探索安卓... 你有没有想过,你的苹果手机X竟然也能刷上安卓系统?是的,你没听错,就是那个一直以来都和我们苹果手机X...
安卓系统智商低吗,智商低下的真... 你有没有想过,为什么安卓系统的智商总被调侃得好像有点低呢?是不是觉得它总是慢吞吞的,有时候还犯点小错...
安卓系统手机联系人,揭秘你的社... 你有没有发现,手机里的联系人列表就像是一个小小的社交圈呢?里面藏着我们的亲朋好友、工作伙伴,甚至还有...
安卓系统免费铃声下载,打造个性... 手机里那首老掉牙的铃声是不是让你觉得有点out了呢?别急,今天就来给你支个招,让你轻松给安卓手机换上...
安卓系统用哪个桌面好,打造个性... 你有没有发现,手机桌面可是我们每天都要面对的“脸面”呢?换一个好看的桌面,心情都能跟着好起来。那么,...
虚拟大师是安卓10系统,功能与... 你知道吗?最近在手机圈里,有个新玩意儿引起了不小的轰动,那就是虚拟大师!而且,更让人惊喜的是,这个虚...
安卓系统与苹果优缺点,系统优缺... 说到手机操作系统,安卓和苹果绝对是两大巨头,它们各有各的特色,就像两道不同的美味佳肴,让人难以抉择。...
安卓win双系统主板,融合与创... 你有没有想过,一台电脑如果既能流畅运行安卓系统,又能轻松驾驭Windows系统,那该有多爽啊?没错,...
安卓系统可精简软件,轻松提升手... 你有没有发现,手机里的安卓系统越来越庞大,软件也越装越多,有时候感觉手机就像个“大肚子”,不仅运行速...
安卓系统基于linux的代码,... 你有没有想过,那个陪伴你每天刷抖音、玩游戏、办公的安卓系统,其实背后有着一套复杂的基于Linux的代...
苹果和安卓的拍照系统,谁更胜一... 你有没有发现,现在手机拍照已经成为我们生活中不可或缺的一部分呢?无论是记录生活的点滴,还是捕捉美丽的...
苹果和安卓系统不同吗,系统差异... 你有没有想过,为什么你的手机里装的是苹果的iOS系统,而朋友的手机却是安卓系统呢?这两种系统,看似都...
安卓系统有多少级,揭秘其多级架... 你有没有想过,那个陪伴我们日常生活的安卓系统,它其实有着丰富的层级结构呢?没错,就是那个让我们的手机...
华为鸿蒙系统与安卓的,技术融合... 你知道吗?最近科技圈可是炸开了锅,华为鸿蒙系统与安卓的较量成为了大家热议的话题。这不,今天我就来给你...
什么安卓手机是苹果系统,搭载苹... 你有没有想过,为什么有些人宁愿花大价钱买苹果手机,而有些人却对安卓手机情有独钟呢?其实,这个问题背后...