我有以下组件
type PropTypes<T> = {
items: T[],
header: (item: T) => React.Element<*>,
body: (item: T) => React.Element<*>,
}
type StateTypes<T> = {
expandItem: ?T,
};
export default class Accordian<T> extends React.Component {
props: PropTypes<T>;
state: StateTypes<T>;
setExpandItem: (expandItem: ?T) => void;
constructor(props: PropTypes<T>) {
super(props);
...
}
}
我真的希望从items
推断出header
的参数具有相同的类型。相反,当我用
<Accordian
items={list}
header={listItem => ...}
/>
我收到了:
-^ React element `Accordian`
20: export default class Accordian<T> extends React.Component {
^ T. This type is incompatible with.
See: src/App/components/Accordian/index.js:20
19: banks: GenericBank[],
^^^^^^^^^^^ object type
我找到了TypeScript的similar question,但我想知道是否可以在FlowType中推断React元素的道具上的泛型类型?
答案 0 :(得分:0)
你的例子不起作用,因为你正在将手风琴的状态初始化为一个字符串。
class Accordian<T> extends React.Component<PropTypes<T>, StateTypes<T> {
state = {
expandItem: '1'
};
}
string
与T
类型不兼容,因为T
可能并非始终为string
。在使用之前,手风琴类不能知道T是什么类型,所以它需要处理所有可能的类型。
如果删除此状态初始化程序,代码就可以正常工作。如果要将初始扩展项设置为items
数组prop中的第一项,您也可以在类构造函数中执行此操作
class Accordian<T> extends React.Component<PropTypes<T>, StateTypes<T>> {
constructor(props) {
super(props)
this.setState({
expandItem: this.props.items[0]
});
}
}