如何让函数对象参数的单个属性支持泛型?
TypeScript泛型函数参数合并为对象的正确写法
你需要把泛型T声明在函数本身的泛型参数列表里,而不是尝试从参数类型中解构。下面是两种正确的实现方式:
方式一:直接内联对象类型
直接在函数的泛型参数中定义T,然后在对象参数类型里使用它:
function test<T>(params: {a: string; b: T; c: number}) { // 函数逻辑 }
调用时TypeScript会自动推导T的类型:
test({a: "foo", b: 123, c: 456}); // T被推导为number test({a: "bar", b: ["a", "b"], c: 789}); // T被推导为string[]
方式二:复用预定义的泛型对象类型
如果已经定义了MyObject<T>类型,只需在函数上声明泛型T,再把它传递给MyObject即可:
type MyObject<T> = {a: string; b: T; c: number}; function test<T>(params: MyObject<T>) { // 函数逻辑 }
这种写法和方式一功能完全相同,只是把对象类型抽成了可复用的别名,适合需要多次使用该类型的场景。
你之前尝试的function test<{_, T, __}>(params: MyObject<T>)是错误的语法——泛型参数列表里只能声明独立的类型参数(比如T),不能用对象解构的形式。TypeScript的泛型参数必须在函数名后的<>里显式声明,之后才能在参数类型、返回值或函数内部引用。
内容的提问来源于stack exchange,提问作者Sam Scolari
相关产品推荐
相关产品推荐

