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
相关产品推荐
相关产品推荐

