TypeScript infer因可选属性未赋值返回never无法正确推断泛型参数怎么办
问题原因
这个问题是TypeScript逆变位置泛型推断的特性导致的:
- 你新增的
propTypes?: WeakValidationMap<P>属性中,泛型P处于逆变位置(函数参数的类型位置) - 当你尝试用整组
FeaturePT数组匹配Feature<infer S>[]时,TypeScript需要找到一个统一的S同时满足CoreProps和AnchorProps在两个逆变位置(state的props参数、propTypes的泛型参数)的类型约束,冲突的逆变候选会导致推断失败,最终返回never。
解决方案
最稳定的修复方式是修改Props提取逻辑,直接从state方法的参数提取泛型,绕开其他属性对推断的干扰:
import type { React, WeakValidationMap } from 'react'; // 保留原有联合转交叉工具类型 type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never; // 直接遍历数组元素,从state方法的props参数提取类型,不受其他属性影响 type GetProps<T extends any[]> = UnionToIntersection< T[number] extends { state?: (state: object, props: infer P) => object | void } ? P : never >; // 修改componentBuilder的泛型约束,兼容带额外属性的Feature类型 let componentBuilder = <T extends { state?: (state: object, props: any) => object | void }[]>(features: T): React.FC<GetProps<T>> => { // 原有实现逻辑不变 return {} as any; };
修改后不管是否传入可选的propTypes属性,都可以正确推断出组件Props为CoreProps & AnchorProps,符合预期。
内容的提问来源于stack exchange,提问作者Eliav Louski
相关产品推荐
相关产品推荐

