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

如何编写TypeScript类型以解析V | (() => V)为V?

如何从V | (() => V)类型中提取出V?

要实现从V | (() => V)这种联合类型里提取出原始类型V,可以用TypeScript的条件类型来精准区分函数和静态值:

type ResolveMaybeFunction<T> = T extends () => infer R ? R : T;

为什么之前的写法不生效?

你之前尝试的ReturnType<T> | T之所以失效,是因为当T包含非函数类型时,ReturnType<T>会因类型不匹配直接返回any,最终整个类型就变成了any | T,结果还是any。而条件类型会先判断输入类型是否符合无参函数的结构:

  • 如果是无参函数,就通过infer R提取它的返回值类型R;
  • 如果是静态值类型,就直接返回原类型。

验证预期结果

我们用你给出的测试场景验证:

// 结果为 string
type Test1 = ResolveMaybeFunction<string | (() => string)>;

// 结果为 { a: number[] }
type Test2 = ResolveMaybeFunction<{ a: number[] } | (() => { a: number[] })>;

// 结果为 AnyArbitraryType
type Test3 = ResolveMaybeFunction<AnyArbitraryType | (() => AnyArbitraryType)>;

所有测试都能得到你期望的转换结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 19:59:58