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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:57:29