![](/img/trans.png)
[英]Use typescript generic to connect props to state in React class component
[英]How to transform a React Class Component with generic props to Function Component in Typescript?
编写接收通用道具的React Component。 以类组件的方式,很容易:
interface TableProps<D> {
data: D
}
class Table<D> extends React.Component<TableProps<D>> { }
但是,以功能组件的方式,我不知道:
// can't figure out a way to define high order generic.
const Table2: <D extends {}> React.SFC<TableProps<D>> = ({ data }) => { }
如何纠正?
问题是您不能声明类型的常量并留下自由的泛型参数(例如D
)。 您可以使用函数类型执行此操作,但不能使用接口/类类型执行此操作。 一种解决方法是创建一个返回组件函数的函数:
interface TableProps<D> {
data: D
}
let Table2: <D>()=>React.SFC<TableProps<D>> = function<D>(){
return ({data}) => {
return <div></div>;
}
}
//Usage
let Table2ForNumbers = Table2<number>();
let d = <Table2ForNumbers data={0}></Table2ForNumbers>;
注意:此解决方案可让您使用Table2
的一个工厂类型的功能部件,这样你就可以拥有的类型安全实例Table2
为特定的类型,如number
在上面的例子。
您不必显式地将其键入为React.FC
即可获得可以正常工作的类型。 (写extends {}
似乎很普遍,但是我认为, extends any
更好地传达实际含义,并且同样有效。)
const Table = <D extends any>({ data }: TableProps<D>): ReactElement => <div>{data}</div>;
它与React.FC
兼容的React.FC
可以通过以下类型评估为true
来看出:
type Dummy = typeof Table extends React.FC<any> ? true : false;
可以肯定的是,您追求的是这样的东西,因为我可以肯定,SFC只是将其渲染为返回JSX的函数,也可以重写它。
const foo = (props: IGenericProps<number>) => {
return (
<div>
</div>
)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.