当前位置:网站首页>带你体验一次类型编程实践
带你体验一次类型编程实践
2022-08-01 02:31:00 【小鑫同学】
写作背景:
在看 uniapp 的教程时看到大量的 API 还是使用的 callback 的方式来接收 API 的执行结果,大量的 API 嵌套使用又会造成回调地狱的现象出现,在 API Promise 化 这一篇中提到了有部分API是已经做了 Promise 化,我这边用 cli 命令初始化的 vite+ts 的项目发现没办法使用对应的 Promise 化 API,所以还是通过一个工具类来实现一下,顺便试着再写一写 TypeScript 类型编程代码。
工具类编写准备:
下面这块代码我相信你有过类似想法的 jym 应该在网上看到过,通过定义这样一个高阶函数来将uniapp api 进行包装,并在执行这个高阶函数返回的函数时使用 Promise 来接管 api 成功失败所对应的回调函数。
export const promisify = (api) => {
return (options, ...params) => {
return new Promise((resolve, reject) => {
api(Object.assign({}, options, {
success: resolve,
fail: reject
}), ...params);
});
}
}
注:高阶函数说的简单点就是传入一个函数并返回一个函数,切记返回的是函数还没有执行,遇到了多少写防抖节流的小伙伴是忘了执行还各个群里问 why 的~
发挥TypeScript类型的强大之处:
Typescript内置类型工具:
Parameters :提取函数类型的参数所组成的类型列表; NonNullable :提取传入类型除 null、undefined 以外的类型;
类型编程分析:
promisify 函数的输入类型约束:输入的内容均是uniapp api(函数),所以使用泛型来约束输入的类型;
const promisify = <P extends (...args: any) => any>(api: P) => {}
promisify 返回的函数的输入类型约束:这个输入类型实际是 uniapp api 执行的的形参类型,所以需要使用内置的类型工具(1)来提取,我们只提取类型列表的第一项即可,有实际需要可以再扩展:
type ParameterFirst<T extends (...args: any) => any> = Parameters<T>[0];
export const promisify = <P extends (...args: any) => any>(api: P) => {
return (options: ParameterFirst<P>) => {}
}
执行完 promisify 返回的函数后 Promise 对象的类型约束:这里只能通过泛型约束成功状态的类型,成功状态的类型实际上是 uniapp api 选项中 success 属性(回调函数)返回的类型。我们需要先提取到 success 属性,然后再次使用内置类型工具(1)来提取回调函数的返回类型。
type ParameterSuccess<T extends (...args: any) => any> = ParameterFirst<NonNullable<Parameters<T>[0]['success']>>;
注:因为Parameters
完整的promisify工具类:
/**
* uni.request({
* url: 'https://jsonplaceholder.typicode.com/todos/1',
* success: (res) => {
* console.log(res.data);
* }
* });
*
* promisify(uni.request)({ url: '' }).then(res => {
* // res.data
* }).catch(err => {
*
* });
*
* @param api
* @returns
*/
/**
* 提取传入函数的第一个形参参数的类型
*/
type ParameterFirst<T extends (...args: any) => any> = Parameters<T>[0];
/**
* 提取传入函数的第一个形参参数中key为success的参数的类型;
* 因success类型为函数类型,所以再次提取success函数的第一个形参参数的类型
*/
type ParameterSuccess<T extends (...args: any) => any> = ParameterFirst<NonNullable<Parameters<T>[0]['success']>>;
export const promisify = <P extends (...args: any) => any>(api: P) => {
return (options: ParameterFirst<P>) => {
return new Promise<ParameterSuccess<P>>((resolve, reject) => {
api(
Object.assign({}, options, {
success: resolve,
fail: reject,
}),
);
});
};
};
结语:
既然选择 TypeScript 来编写项目,就要尽可能的发挥出 TypeScript 作用,在万般无奈的时候再用 any 也不迟 ~~~
边栏推荐
- Completely closed Chrome updated and in the top right corner of the tip
- 软考高级系统架构设计师系列之:系统开发基础知识
- Academicians of the two academies speak bluntly: Don't be superstitious about academicians
- IDEA modifies the annotation font
- OSD read SAP CRM One Order application log way of optimization
- 解决安装MySQL后,Excel打开很慢的问题
- Chinese version of Pylint inspection rules
- 【 】 today in history: on July 31, "brains in vats" the birth of the participant;The father of wi-fi was born;USB 3.1 standard
- 【数据分析】基于matlab GUI学生成绩管理系统【含Matlab源码 1981期】
- 初出茅庐的小李第112篇博客项目笔记之机智云智能浇花器实战(1)-基础Demo实现
猜你喜欢
Talking about hardware device computing storage and data interaction
ROS2 series of knowledge (4): understand the concept of [service]
IDEA does not recognize the module (there is no blue square in the lower right corner of the module)
MYSQL Classic Interview Questions
Google Earth Engine - Error resolution of Error: Image.clipToBoundsAndScale, argument 'input': Invalid type
ARM cross compilation
HCIP(15)
初出茅庐的小李第114篇博客项目笔记之机智云智能浇花器实战(3)-基础Demo实现
Device tree - conversion from dtb format to struct device node structure
树莓派 的 arm 版的 gcc 安装 和环境变量的配置
随机推荐
ARM 交叉编译
Handwritten binary search tree and test
HIRO: Hierarchical Reinforcement Learning 】 【 Data - Efficient Hierarchical Reinforcement Learning
device node结构体转换成platform_device结构体
OSD读取SAP CRM One Order应用日志的优化方式
Js replication
STK8321 I2C(昇佳-加速度传感器)示例
785. 快速排序
MYSQL-Batch insert data
RTL8762DK 点灯/LED(三)
787. Merge Sort
机器学习应该如何入门?
Browser download shortcut to desktop (PWA)
Four ways the Metaverse is changing the way humans work
Chain programming, packages, access
date command
Solve the problem that when IDEA creates a new file by default, right-click, new, there is no XML file
修改Postman安装路径
Modern Enterprise Architecture Framework 1
HCIP(14)