reactjs - TypeScript 不会选择正确的覆盖
问题描述
我刚刚创建了一个动态组件,应该如下所示:
/* 应该继承所有 InputComponent 属性。DefaultComponent 应该是默认的组件道具值。*/
<DynamicComponent component={InputComponent} />
我当前的实现如下所示:
type DefaultProps = { defaultProp: string }
type InputProps = { onChange: () => void }
type DynamicType<P> = DynamicProps & { component: ReactType<P> } & P
export default function DynamicComponent(props: DynamicProps & { component?: DefaultComponent } & DefaultComponentProps): ReactElement<DefaultComponentProps>
export default function DynamicComponent<P>(props: DynamicType<P>): ReactElement<P> {
const { style: overrideStyle, component } = props
const { style } = getStyle(props)
const mergedStyle = { ...style, ...overrideStyle }
return React.createElement(component, { ...props, style: mergedStyle })
};
DynamicComponent.defaultProps = { component: DefaultComponent }
所以我希望接下来会发生:
1.)当组件未定义时,我希望第一次覆盖(默认的那个)
<DynamicComponent defaultProps='itsTotallyValid' /> // valid
2.) 定义组件时,我希望继承它的属性
<DynamicComponent component={InputComponent} onChange={() =>{}} /> // valid
由于某种原因,第二种情况永远不会发生,它总是选择第一种。有没有办法更严格,所以我可以强迫第二种情况成为可能?
更新
解决方案
解决注释中关于默认泛型类型阻塞类型推断的问题,但事实并非如此,下面的最小示例演示了类型推断在T
默认为 的类型上工作string
,
function Bar<T = string>(props: { component: T }) : T {
return props.component
}
Bar({ component : 'string' })
Bar({ component : 5 }) // <-- Type inferred to be number
推荐阅读
- fiddler - Fiddler 未捕获来自特定主机的流量
- php - 我想访问此页面的关注者,但它只显示这么多数据
- python - 在 Keras 中使用迁移学习训练 CNN - 图像输入不起作用,但矢量输入起作用
- struts2 - 需要将 Struts 2.3.24.1 更新到 Struts 最新版本,即 2.5.20
- php - PHP:MySQL 数据库表中的更新不起作用
- javascript - 使用 JQuery 获取单元格值
- android - 模拟器在 Mac 上的 Android Studio 上暂时显示
- python - 如何在 django 单元测试中重现以下 IntegrityError?
- python - 当数据中有缺失值时,Pandas DataFrame max() 和 apply(max) 返回不同的值
- javascript - Webpack 在我的样板项目中构建时无法解析其他模块