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

TypeScript中能否从函数参数属性自动推断泛型类型参数?

你尝试的写法无法实现需求,存在两个核心问题:

  • 类型约束误用了不存在的type字段:你的请求类型体系里只有status属性,你写的Request & {type: T}会要求入参必须额外携带type字段,不仅无法关联status做类型推断,还会直接触发类型不匹配报错。
  • 类型谓词语法错误:类型谓词左侧必须是函数参数名,你写的T is MapRequest[T]属于语法错误,无法起到入参类型收窄的作用。

正确实现方案

只需要把泛型T和入参的status字段绑定,就能让TypeScript自动从入参推断泛型类型,实现无需手动传泛型的自动窄化:

enum Status {
  Open = "open",
  Closed = "closed"
}

interface DefaultRequest {
  status: Status
}

interface OpenRequest extends DefaultRequest {
  status: Status.Open;
  data?: Record<string, Status.Open>
}

interface CloseRequest extends DefaultRequest {
  status: Status.Close;
  data?: Record<string, Status.Close>
}

interface MapRequest {
  [Status.Open]: OpenRequest;
  [Status.Close]: CloseRequest;
}

type Request = OpenRequest | CloseRequest;

// 修正后的校验函数
function isValidRequestType<T extends Status>(data: { status: T } & Request): data is MapRequest[T] {
  // 此处可补充实际业务校验逻辑,示例直接返回true
  return true;
}

// 调用测试
// 无需手动传入泛型,TS自动推断T为Status.Open,入参被窄化为OpenRequest
isValidRequestType({ status: Status.Open })
// 无需手动传入泛型,TS自动推断T为Status.Closed,入参被窄化为CloseRequest
isValidRequestType({ status: Status.Closed })

实现原理

TypeScript的泛型推断支持从参数的字面量属性值提取类型:你把参数的status字段类型绑定到泛型T,调用时TS会自动根据你传入的status枚举值推导T的具体类型,再通过data is MapRequest[T]的类型谓词把入参收窄为对应状态的请求类型。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:51:03