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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:12:03