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

