如何编写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
相关产品推荐
相关产品推荐

