如何在TypeScript中实现带类型推断的泛型函数生成器
如何实现具备自动类型推断的泛型函数生成器
问题分析
你之前的generateFunction定义要求传入一个自身带有泛型参数的函数(<T>(args: T) => boolean),但实际传入的是普通函数({ prop }) => true。此时TypeScript无法推断出T的具体结构,会默认将T视为unknown,因此解构prop时会报错“Property 'prop' does not exist on type 'unknown'”。
你的核心需求是:让生成的函数能够根据传入的函数参数结构,自动约束调用时的参数类型,无需显式指定泛型。
正确实现
将generateFunction本身定义为泛型函数,泛型参数对应传入函数的参数类型,这样TypeScript就能自动推断出参数结构:
function generateFunction<T>(fn: (args: T) => boolean) { return fn; }
验证效果
使用上述实现后,TypeScript会自动根据传入的函数推断出参数类型:
// 自动推断T为 { prop: unknown } const resultFunction = generateFunction(({ prop }) => { return true; }); // ❌ 报错:类型"string"不能赋值给类型"{ prop: unknown; }" resultFunction('text'); // ✅ 合法 resultFunction({ prop: "winter" });
如果需要更精确的类型约束,可以在传入函数时显式指定参数类型,或者利用上下文推断:
// 显式指定参数类型,推断T为 { prop: string } const resultFunction = generateFunction(({ prop }: { prop: string }) => { return true; }); // ❌ 报错:类型"number"不能赋值给类型"string" resultFunction({ prop: 123 }); // ✅ 合法 resultFunction({ prop: "winter" });
或者通过函数内部的使用场景让TypeScript自动推断更精确的类型:
// 函数中使用prop的length属性,自动推断T为 { prop: string } const resultFunction = generateFunction(({ prop }) => { return prop.length > 0; }); // ❌ 报错:类型"number"不存在属性"length" resultFunction({ prop: 123 }); // ✅ 合法 resultFunction({ prop: "winter" });
为什么原写法不行
原定义中generateFunction的参数是<T>(args: T) => boolean,这表示传入的函数必须是一个泛型函数(即函数本身可以接受任意类型的T)。但你传入的是普通函数,TypeScript只能将T推断为unknown,自然无法解构出prop属性。而将generateFunction改为自身带泛型参数的形式后,泛型T会绑定到传入函数的参数类型,从而实现预期的类型约束。
内容的提问来源于stack exchange,提问作者Azvya Erstevan
相关产品推荐
相关产品推荐

