TypeScript如何为可调用的泛型参数指定正确类型?
解决方案
你遇到的报错原因是没有对泛型参数ControllerT增加类型约束,TS默认将无约束的泛型判定为unknown类型,自然不允许直接调用。
你可以通过约束泛型为「接收单个请求体参数、返回Promise的函数」来解决问题,不需要枚举所有控制器类型,支持完全自动类型推断:
// utils/adapters.ts import express from 'express' // 泛型会自动从传入的控制器推导请求体和返回值类型 export const postHandler = <ReqBody, ResPayload>( controller: (body: ReqBody) => Promise<ResPayload> ) => (req: express.Request<{}, {}, ReqBody>, res: express.Response<ResPayload>) => { controller(req.body).then((payload) => { res.status(200).json(payload) }) }
实现说明
- 这里用两个泛型
ReqBody、ResPayload分别对应控制器的入参类型和返回的响应数据类型,会在你调用postHandler(控制器)时自动从控制器的类型定义推断,不需要手动传参 - 同时还自动绑定了Express的
Request.body和Response的类型,获得完整的类型校验,不需要手动声明任何额外的联合类型 - 后续新增任何符合
(参数:对象) => Promise<响应对象>签名的控制器,都可以直接用这个postHandler封装,不需要修改工具函数的代码
你原来的路由代码、控制器代码不需要做任何修改,即可直接使用这个实现。
内容的提问来源于stack exchange,提问作者cyrf
相关产品推荐
相关产品推荐

