【发布时间】:2019-11-03 05:19:27
【问题描述】:
我刚刚创建了一个动态组件,应该如下所示:
/* 应该继承所有 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
由于某种原因,第二种情况永远不会发生,它总是选择第一种。有没有办法更严格,所以我可以强制第二种情况成为可能?
更新
【问题讨论】:
-
为什么有两个函数声明?
-
是的,这是我想要前进的一种方式,但如果我能用一个组件解决这个问题会更好。 (否则我可以使用 DefaultDynamicComponent + DynamicComponent)
-
Typescript 支持泛型的默认值。您可以提供
<P = DefaultComponent> -
问题是,由于我的泛型有点来自推断道具类型并从它继承,我不能真正为泛型添加默认值:type DynamicType
= DynamicProps & { component: ReactType
} & P
-
你能发帖吗,
DynamicProps?
标签: reactjs typescript typescript-typings typescript-generics react-tsx