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

TypeScript如何仅指定部分泛型参数 剩余参数由TS自动推导

问题根本原因

当前TypeScript(截至5.4稳定版)不支持部分泛型参数推断:只要你手动指定了任意一个泛型参数,剩下的泛型参数都会直接使用默认值,不会再从函数入参自动推导,因此你最初的写法要求必须传入两个泛型参数才不会报错。

更简洁的实现方案

方案1:复用柯里化实例(适合固定TDoc场景)

如果你的业务中会高频使用同一个TDoc类型,可以提前实例化外层柯里化函数,后续调用不需要多写括号:

// 原有柯里化实现
function configDocWarpper<TDoc extends Doc> (){
  return  function _configDoc<TProperty extends Partial<TDoc['properties']>>(options: Options<TProperty>): TProperty{
    return options['properties']
  }
}
// 提前实例化对应Doc类型的配置函数
const configDoc = configDocWarpper<Doc>()
// 直接调用即可,类型推导完全符合预期
const propA = configDoc({properties:{propA:'str' as const}}) // 类型:{propA:'str'}
const propB = configDoc({properties:{propB:100 as const}}) // 类型:{propB:100}

该方案不需要修改原有实现,改造成本最低。

方案2:入参携带类型标记(适合多TDoc切换场景)

通过参数携带TDoc的类型信息,完全不需要手动指定泛型参数,避免嵌套括号:

interface Doc {
  properties: {
    propA: string,
    propB: number
  }
}
type Options<TDoc extends Doc, TProperty extends Partial<TDoc['properties']>> = {
  properties: TProperty
  // 仅用于传递类型,运行时不会产生实际开销
  docType?: TDoc
}
// 函数实现不需要额外处理docType字段
function configDoc<TDoc extends Doc, TProperty extends Partial<TDoc['properties']>>(options: Options<TDoc, TProperty>): TProperty { 
  return options.properties
}
// 调用时通过as断言传递TDoc类型,不需要手动传泛型
const propA = configDoc({
  docType: {} as Doc,
  properties: {propA: 'str'} as const
})
// 可以封装类型标记工具简化写法
const ofType = <T,>() => ({}) as T
const propB = configDoc({
  docType: ofType<Doc>(),
  properties: {propB: 100} as const
})

该方案写法更直观,不需要嵌套函数调用,适合需要频繁切换不同TDoc类型的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:57:04