为何TypeScript传入参数后仍要求指定泛型类型?
问题原因与解决方案
问题根源
TypeScript的泛型规则是:要么完全让编译器自动推断所有泛型参数,要么显式指定所有无默认值的泛型参数。当你手动指定了其中一个泛型参数(比如这里的T),编译器会认为你要手动传入所有泛型参数,不会再自动推断剩下的P,因此抛出“Expected 2 type arguments, but got 1”的错误。
解决方案
方案1:给泛型P设置默认值
给P添加默认类型后,显式指定T时,P可以使用默认值,同时编译器依然能从参数p自动推断出P的实际类型:
const numberStringConverter = <T extends string | number, P extends {x: any} = {x: any}>(p: P): T => { if(typeof p.x === 'string'){ return Number(p.x) as T } if(typeof p.x === 'number'){ return String(p.x) as T } return p.x as T; } // 正常调用,ret类型为string const ret = numberStringConverter<string>({x:1})
方案2:移除不必要的泛型P
如果不需要保留P的具体类型,只是想约束参数结构,直接用类型约束作为参数类型即可,代码更简洁:
const numberStringConverter = <T extends string | number>(p: {x: any}): T => { if(typeof p.x === 'string'){ return Number(p.x) as T } if(typeof p.x === 'number'){ return String(p.x) as T } return p.x as T; } const ret = numberStringConverter<string>({x:1}) // 正常运行
补充说明
你遇到的场景确实和社区中“部分泛型参数推断”的需求相关,目前TypeScript原生不支持只显式指定部分泛型参数、让编译器推断剩余参数的能力,只能通过设置泛型默认值这类方式绕过。
内容的提问来源于stack exchange,提问作者xianshenglu
相关产品推荐
相关产品推荐

