TypeScript条件泛型拆分联合类型问题咨询
问题分析与解决
原因:分布式条件类型的自动分发
你遇到的问题源于TypeScript的分布式条件类型特性:当条件类型的泛型参数是联合类型时,TypeScript会自动将联合类型的每个成员单独代入条件判断,再把所有结果合并成新的联合类型。
在你的代码中,VoidFunctionOrWithParams<'one' | 'two'>会被拆解执行:
- 代入
'one':'one' extends void不成立,返回(params: 'one') => void - 代入
'two':'two' extends void不成立,返回(params: 'two') => void - 最终合并为联合类型
((params: "one") => void) | ((params: "two") => void)
解决办法:阻止条件类型的分发
要让联合类型作为一个整体参与条件判断,只需把泛型参数用方括号[]包裹,破坏分布式条件类型的触发条件:
type VoidFunctionOrWithParams<Params> = [Params] extends [void] ? VoidFunction : (params: Params) => void;
此时再使用:
type WithStringParams = VoidFunctionOrWithParams<'one' | 'two'>;
得到的结果就是你期望的:
(params: 'one' | 'two') => void
边界场景验证
当传入void时,依然能正确返回VoidFunction:
type VoidFn = VoidFunctionOrWithParams<void>; // 类型为 VoidFunction
内容的提问来源于stack exchange,提问作者Chad Lewis
相关产品推荐
相关产品推荐

