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
相关产品推荐
相关产品推荐

