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

TypeScript infer因可选属性未赋值返回never无法正确推断泛型参数怎么办

问题原因

这个问题是TypeScript逆变位置泛型推断的特性导致的:

  1. 你新增的propTypes?: WeakValidationMap<P>属性中,泛型P处于逆变位置(函数参数的类型位置)
  2. 当你尝试用整组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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:06:04