Node.js Express的IRouterMatcher中未使用的Method泛型作用是什么
这个没有在接口内部使用的Method泛型是TypeScript中典型的幻影类型参数(Phantom Type Parameter),作用是给类型附加额外的标识信息,不需要参与接口内部的类型运算,具体优势有以下几点:
实现同结构类型的差异化区分
Express的官方类型定义中,会针对不同请求方法分别实例化IRouterMatcher接口挂载到路由实例上:
interface IRouter { all: IRouterMatcher<this, 'all'> get: IRouterMatcher<this, 'get'> post: IRouterMatcher<this, 'post'> put: IRouterMatcher<this, 'put'> delete: IRouterMatcher<this, 'delete'> // 其余请求方法同理 }
如果没有Method这个泛型标识,所有请求方法对应的IRouterMatcher实例因为内部结构完全一致,会被TypeScript判定为相同类型。加上这个参数之后,不同方法的路由匹配器就是完全独立的类型,能避免类型混用的问题,也支持基于请求方法的类型收窄逻辑。
降低后续类型扩展的改造成本
当前版本的类型定义里暂时没有用到这个参数,但如果后续需要新增和请求方法绑定的类型约束,不需要修改IRouterMatcher的内部结构,直接基于Method做条件类型判断即可。比如要实现「仅POST/PUT方法允许传入表单文件类型的请求体校验」的逻辑,只需要修改调用签名里的ReqBody默认值,加个Method extends 'post' | 'put' ? FormBody : any的判断就行,现有业务代码的类型不会受到任何影响,兼容性极强。
方便上层封装做类型推断
很多基于Express的上层框架、类型工具都会直接读取IRouterMatcher上的Method泛型来实现自动类型能力,比如自动生成OpenAPI接口文档、自动生成前端请求调用SDK的时候,不需要额外做类型断言,直接从泛型参数就能拿到对应路由的请求方法,大幅降低上层封装的类型开发成本。
内容的提问来源于stack exchange,提问作者A30590

