如何在TypeScript中将一个函数的返回类型作为另一函数的参数类型
解决思路
你的需求本质是约束对象内两个方法的类型做关联,你之前的条件类型写法核心逻辑是对的,主要有两个需要修正的点,同时可以根据你的使用场景选择更简便的实现方式:
方案1:用泛型直接定义关联结构(最常用)
如果你是要定义一类符合「foo返回值类型等于bar入参类型」规则的对象,直接用带泛型的类型定义即可,不需要用条件类型:
// 泛型A对应foo的返回值类型,同时约束为bar的入参类型 type Shape<A> = { foo: () => A; bar: (arg: A) => boolean; }
如果不想每次手动声明泛型,可以写一个工具函数自动推导类型:
function defineShape<A>(shape: Shape<A>) { return shape; } // 无需手动指定类型,TS会自动根据foo的返回值推断A为string类型 const shape = defineShape({ foo: () => 'hi', // 这里arg会被自动推断为string类型,不需要额外加类型标注 bar: (arg) => typeof arg === 'string' })
方案2:修正你的条件类型写法
如果你确实需要从已有对象类型反向推导生成关联类型,你之前的写法只需要改两个问题:
- TS 中布尔类型是
boolean,不是bool - 条件类型
Cond是高阶类型,需要传入实际的对象类型参数才能使用
修正后的写法:
type Cond<T> = T extends { foo: () => infer A } ? { foo: () => A; bar: (arg: A) => boolean } : never // 已有原始对象 const rawShape = { foo: () => 'hi', bar: (arg: string) => typeof arg === 'string' } // 给原始对象套用修正后的Cond类型,就能得到关联约束 const shape: Cond<typeof rawShape> = rawShape;
常见失效原因
如果还是没有生效,大概率是以下两种情况:
- 你没有给
Cond传入类型参数,直接写了const shape: Cond = {},这种写法不符合泛型/条件类型的使用规则 - 你的原始对象的
foo方法类型定义不明确,导致TS无法推断出infer A的实际类型,可以给foo加显式的返回类型标注解决
内容的提问来源于stack exchange,提问作者Vlad。
相关产品推荐
相关产品推荐

