type
status
date
slug
summary
tags
category
icon
password
(虽然工作上用不到
constructor
,导致 TypeScript 只是个类型检查器)(写到一半突然发现 AJAX 的方法好像是工厂函数。只能草草进入正题)
业务上的 API 接口从 AJAX 工厂函数中生成,而每个接口的
request body
和 response 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 也有很好的支持