ReactTS通过动态组件属性扩展类型吗?

时间:2019-05-21 11:24:10

标签: reactjs typescript typescript-typings

是否有一个React组件可以动态地找到它的道具呢?

示例:

type BaseType = {
   baseProp?: ...
   as?: ...
}

type Extended = {
   extendedProp?: ...
}

<Base /> // expected props => { baseProp }
<Base as={ExtendedComponent} extendedProp={...} /> // expected props => { baseProp, extendedProp } 

1 个答案:

答案 0 :(得分:1)

this的答案中得到提示,我们可以使用交集先从as推断道具的类型,然后使用这些道具来验证任何其他属性:

type BaseType = {
  baseProp?: number
}

type Extended = {
  extendedProp?: string
}

declare const ExtendedComponent: React.FC<Extended>
function Base<T = {}>(p: BaseType & { as? : React.ComponentType<T>} & T): React.ReactElement{
  if(p.as) {
    const Child = p.as;
    return <div>{p.baseProp}<Child {...p as T}></Child></div>
  }else {
    return <div>{p.baseProp}</div>
  }
}


let s = <Base /> // expected props => { baseProp }
let a = <Base as={ExtendedComponent} extendedProp="a" />