type
status
date
slug
summary
tags
category
icon
password
(虽然工作上用不到 constructor ,导致 TypeScript 只是个类型检查器)
写到一半突然发现 AJAX 的方法好像是工厂函数。只能草草进入正题)
 
业务上的 API 接口从 AJAX 工厂函数中生成,而每个接口的 request bodyresponse body 有相同的部分,也有不同的部分。
例如:业务状态码 responseCode: string,数据字段 data: any 在每个接口中都会存在;但除此以外的字段,以及 data 的详细类型就各有不同了。
如果直接对每一个创建的 API 请求实例定义其类型,很明显会极大幅度地增加重复代码。此时使用 TypeScript 的泛型,则可以根据在工厂函数的基础实例上,“继承”出每个实例都不相同的类型,定义给每一个 API。
(什么你问我为什么不用 any?)
 

泛型(Generics)是什么

官方文档已经写得很详细了。甚至开头就提出软件工程需要”良好定义、具有一致性的 API“且”可复用“。
我在此理解为一种便于扩展(flexible)的类型定义。
 

如何定义

在文章开头提到的场景下,至少需要两种类型定义:
所有 API 的基础类型定义(如包含状态码的)。 此处定义为 APIBaseResponseType
每个 API 自有的字段定义(如定义 data: number[] 的)。此处定义为 APIExtendReponseType
需要注意的是,每一个 API 应定义其独立且唯一的 APIExtendResponseType
 
由于 API 调用实际上是由工厂函数生成的,我们还需要将工厂函数所返回的函数 APIConstructorType 定义好。
 
接着,就可以为使用泛型定义 API 的类型了:
如此定义后,genericsAPIExample 的类型被泛型定义为了 { responseCode: string, data: number[] }
(其实理解为在类型定义上使用 Object.assign 就好)
 

杂谈

其实为了定义接口,有时还需要去和后端友好交流给出的接口文档或是详细的字段值。
虽然出于前后端分离的特性, AnyScript 有时候也是没有选择的选择,但类型检测给开发带来的安全感是无法替代的。
建议由于客观限制,无法使用 TypeScript 的同学可以尝试以下 JSDoc。VSCode 也有很好的支持

© 2021-2024 - Diru’s Daydream -

Powered by NotionNext / Theme by NotionKylin