如何在功能组件的React中的props中使用泛型?

在基于类的组件中,我可以轻松编写一些如下代码:

import * as React from 'react';

import { render } from 'react-dom';

interface IProps<T> {

collapsed: boolean;

listOfData: T[];

displayData: (data: T, index: number) => React.ReactNode;

}

class CollapsableDataList<T> extends React.Component<IProps<T>> {

render () {

if (!this.props.collapsed) {

return <span>total: {this.props.listOfData.length}</span>

} else {

return (

<>

{

this.props.listOfData.map(this.props.displayData)

}

</>

)

}

}

}

render(

<CollapsableDataList

collapsed={false}

listOfData={[{a: 1, b: 2}, {a: 3, b: 4}]}

displayData={(data, index) => (<span key={index}>{data.a + data.b}</span>)}

/>,

document.getElementById('root'),

)

实际上,该CollapsableDataList组件应该是功能组件,因为它是无状态的,但是我不知道如何编写功能组件并在props中使用泛型,对我有什么建议?

回答:

您不能使用类型注释创建功能组件并使之通用。因此,这将T无法正常使用,并且无法在变量级别进行定义:

const CollapsableDataList : React.FunctionComponent<IProps<T>> = p => { /*...*/ }

但是,您可以跳过类型注释,并使函数泛型并props显式键入。

import * as React from 'react';

import { render } from 'react-dom';

interface IProps<T> {

collapsed: boolean;

listOfData: T[];

displayData: (data: T, index: number) => React.ReactNode;

}

const CollapsableDataList = <T extends object>(props: IProps<T> & { children?: ReactNode }) => {

if (!props.collapsed) {

return <span>total: {props.listOfData.length}</span>

} else {

return (

<>

{

props.listOfData.map(props.displayData)

}

</>

)

}

}

render(

<CollapsableDataList

collapsed={false}

listOfData={[{a: 1, b: 2}, {a: 3, c: 4}]}

displayData={(data, index) => (<span key={index}>{data.a + (data.b || 0)}</span>)}

/>,

document.getElementById('root'),

)

以上是 如何在功能组件的React中的props中使用泛型? 的全部内容, 来源链接: utcz.com/qa/431485.html

回到顶部