React组件props.onChange传Event触发never类型错误原因排查
错误原因分析
TypeScript无法关联泛型条件类型与组件props的运行时值
你的OnChangeProps是基于泛型布尔参数的条件类型,但组件中的isForwarded是普通boolean类型(而非字面量true/false),TypeScript没法把这个运行时布尔值和条件类型的泛型参数做绑定。当泛型参数是boolean联合类型时,条件类型会触发分发特性,最终onChange的类型会变成两种回调类型的联合,而它们的参数类型交集为never(比如Event和string/number没有重叠类型),所以调用时无论传什么参数都会提示无法赋值给never。举个简化的类型定义示例:
type OnChangeProps<T, IsForwarded extends boolean> = IsForwarded extends true ? { onChange: (e: Event) => void } : { onChange: (value: T) => void }; // 组件props定义 type InputProps<T> = { isForwarded: boolean } & OnChangeProps<T, boolean>;这里
OnChangeProps<T, boolean>会被分发为{ onChange: (e: Event) => void } | { onChange: (value: T) => void },此时onChange的参数类型是Event & T,如果T是string或number,这个交集就是never。手动类型断言无法解决根本问题
你用event as Event做断言,但TypeScript已经确定当前onChange的参数类型是never,断言只能改变TS对event的认知,无法改变onChange的参数类型要求,所以错误依然存在。
内容的提问来源于stack exchange,提问作者Vico
相关产品推荐
相关产品推荐

