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

Typescript中如何部分指定函数类型并自动推断返回Promise的泛型参数?

解决方案

你需要通过高阶工厂函数实现需求:直接为变量标注固定泛型类型会覆盖TS对返回值的自动推断,用两层泛型的工厂函数可以同时实现入参约束、返回Promise校验、返回值类型自动推导三个要求。

实现代码

// 泛型工厂函数,入参K指定keys数组的元素类型
function createMagicFunction<K>() {
  return <R>(fn: (str: string, keys: Array<K>) => Promise<R>) => fn;
}

使用示例

// 先初始化K为number类型的函数构造器
const defineNumberMagic = createMagicFunction<number>();

const f1 = defineNumberMagic(async (str, keys) => {
  return '42'
})
// 自动推导typeof f1为:(str: string, keys: Array<number>) => Promise<string>

const f2 = defineNumberMagic(async (str, keys) => {
  return keys.length;
})
// 自动推导typeof f2为:(str: string, keys: Array<number>) => Promise<number>

// 非Promise返回值会触发编译错误
const f_error2 = defineNumberMagic((str, keys) => {
  return keys.length;
})
// 报错信息:类型“(str: string, keys: number[]) => number”的参数不能赋给类型“(str: string, keys: number[]) => Promise<unknown>”的参数。
// 类型“number”不可分配给类型“Promise<unknown>”

实现说明

  • 第一层泛型K用来提前指定第二个入参数组的元素类型,满足你固定入参规则
  • 第二层泛型R由TS自动根据函数返回值推导,无需手动指定,不会出现被unknown/any覆盖的问题
  • 入参会被自动约束为string和Array<K>类型,无需手动标注参数类型
  • 强制要求函数返回值为Promise类型,同步返回值会直接触发编译报错,符合校验要求

内容的提问来源于stack exchange,提问作者paroxyzm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:15:05