You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
  })
}

实现说明

  1. 这里用两个泛型ReqBody、ResPayload分别对应控制器的入参类型和返回的响应数据类型,会在你调用postHandler(控制器)时自动从控制器的类型定义推断,不需要手动传参
  2. 同时还自动绑定了Express的Request.body和Response的类型,获得完整的类型校验,不需要手动声明任何额外的联合类型
  3. 后续新增任何符合(参数:对象) => Promise<响应对象>签名的控制器,都可以直接用这个postHandler封装,不需要修改工具函数的代码

你原来的路由代码、控制器代码不需要做任何修改,即可直接使用这个实现。


内容的提问来源于stack exchange,提问作者cyrf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:54:04