错误 "Property 'type' is missing in type 'typeof WithXXX'"
Error "Property 'type' is missing in type 'typeof WithXXX'"
我正在将 React 与 Typescript 结合使用,并尝试基于 react-dnd 库创建一个高阶组件。错误发生在react-dnd组件的DragSource部分。这是对应的代码:
import React from 'react';
import { DragSource, ConnectDragSource, DragSourceConnector, DragSourceMonitor } from 'react-dnd';
import ItemTypes from './itemTypes'
const collect = (connect: DragSourceConnector, monitor: DragSourceMonitor) => {
return {
connectDragSource: connect.dragSource(),
isDragging: monitor.isDragging()
}
}
const templateObjectSource = {
beginDrag(props: any) {
return {}
}
}
export interface TemplateObjectCollectedProps {
canDrop: boolean
isOver: boolean
connectDragSource: ConnectDragSource
}
export interface TemplateObjectProps {
name?: string
}
function withTemplateObjectDraggable(WrappedComponent: React.ComponentClass<TemplateObjectProps>) {
return class WithTemplateObjectDraggable extends React.Component<TemplateObjectCollectedProps> {
public render() {
return this.props.connectDragSource(
<div>
<WrappedComponent {...this.props} />
</div>
)
}
}
}
export default DragSource(ItemTypes.TEXTFIELD, templateObjectSource, collect)(withTemplateObjectDraggable)
Typescript 在最后一行给我以下错误,特别是在“(withTemplateObjectDraggable)”部分:
[ts]
Argument of type '(WrappedComponent: ComponentClass<TemplateObjectProps, any>) => typeof WithTemplateObjectDraggable' is not assignable to parameter of type 'ComponentType<ComponentClass<TemplateObjectProps, any>>'.
Type '(WrappedComponent: ComponentClass<TemplateObjectProps, any>) => typeof WithTemplateObjectDraggable' is not assignable to type 'FunctionComponent<ComponentClass<TemplateObjectProps, any>>'.
Type 'typeof WithTemplateObjectDraggable' is not assignable to type 'ReactElement<any>'.
Property 'type' is missing in type 'typeof WithTemplateObjectDraggable'. [2345]
我不确定我是否错误地使用了高阶组件,或者它是否只是一个类型主题。不幸的是,我没有找到将 react-dnd 与其他高阶组件结合起来的示例,所以我可能走错了路。如果你能为我提供一个 link 到一个工作打字稿(或 javascript)示例,它已经对我有帮助,它在 react-dnd 中的 "DragSource" 之上实现了一个高阶组件,因为我不能找不到一个。
仅供参考:然后我会像这样使用高阶组件:
import React from 'react';
import imgTextfield from '../../../../../assets/templateObjects/textfield.png'
import withTemplateObjectDraggable from './withTemplateObjectDraggable'
class Textfield extends React.Component {
public render() {
return (
<span>
<img src={imgTextfield} />
<div> Textfield </div>
</span>
)
}
}
export default withTemplateObjectDraggable(Textfield)
看来你的逻辑有点不对。 DragSource
需要一个 React 组件作为输入,但你试图将你的 withTemplateObjectDraggable
HOC 传入。因此 Typescript 抱怨类型不兼容。
我不是 100% 确定它是否有效,但请尝试将 DragSource
移动到您的 HOC 中,如下所示:
function withTemplateObjectDraggable(WrappedComponent: React.ComponentClass<TemplateObjectProps>) {
class WithTemplateObjectDraggable extends React.Component<TemplateObjectCollectedProps> {
public render() {
return this.props.connectDragSource(
<div>
<WrappedComponent {...this.props} />
</div>,
);
}
}
return DragSource(ItemTypes.TEXTFIELD, templateObjectSource, collect)(WithTemplateObjectDraggable);
}
我正在将 React 与 Typescript 结合使用,并尝试基于 react-dnd 库创建一个高阶组件。错误发生在react-dnd组件的DragSource部分。这是对应的代码:
import React from 'react';
import { DragSource, ConnectDragSource, DragSourceConnector, DragSourceMonitor } from 'react-dnd';
import ItemTypes from './itemTypes'
const collect = (connect: DragSourceConnector, monitor: DragSourceMonitor) => {
return {
connectDragSource: connect.dragSource(),
isDragging: monitor.isDragging()
}
}
const templateObjectSource = {
beginDrag(props: any) {
return {}
}
}
export interface TemplateObjectCollectedProps {
canDrop: boolean
isOver: boolean
connectDragSource: ConnectDragSource
}
export interface TemplateObjectProps {
name?: string
}
function withTemplateObjectDraggable(WrappedComponent: React.ComponentClass<TemplateObjectProps>) {
return class WithTemplateObjectDraggable extends React.Component<TemplateObjectCollectedProps> {
public render() {
return this.props.connectDragSource(
<div>
<WrappedComponent {...this.props} />
</div>
)
}
}
}
export default DragSource(ItemTypes.TEXTFIELD, templateObjectSource, collect)(withTemplateObjectDraggable)
Typescript 在最后一行给我以下错误,特别是在“(withTemplateObjectDraggable)”部分:
[ts]
Argument of type '(WrappedComponent: ComponentClass<TemplateObjectProps, any>) => typeof WithTemplateObjectDraggable' is not assignable to parameter of type 'ComponentType<ComponentClass<TemplateObjectProps, any>>'.
Type '(WrappedComponent: ComponentClass<TemplateObjectProps, any>) => typeof WithTemplateObjectDraggable' is not assignable to type 'FunctionComponent<ComponentClass<TemplateObjectProps, any>>'.
Type 'typeof WithTemplateObjectDraggable' is not assignable to type 'ReactElement<any>'.
Property 'type' is missing in type 'typeof WithTemplateObjectDraggable'. [2345]
我不确定我是否错误地使用了高阶组件,或者它是否只是一个类型主题。不幸的是,我没有找到将 react-dnd 与其他高阶组件结合起来的示例,所以我可能走错了路。如果你能为我提供一个 link 到一个工作打字稿(或 javascript)示例,它已经对我有帮助,它在 react-dnd 中的 "DragSource" 之上实现了一个高阶组件,因为我不能找不到一个。
仅供参考:然后我会像这样使用高阶组件:
import React from 'react';
import imgTextfield from '../../../../../assets/templateObjects/textfield.png'
import withTemplateObjectDraggable from './withTemplateObjectDraggable'
class Textfield extends React.Component {
public render() {
return (
<span>
<img src={imgTextfield} />
<div> Textfield </div>
</span>
)
}
}
export default withTemplateObjectDraggable(Textfield)
看来你的逻辑有点不对。 DragSource
需要一个 React 组件作为输入,但你试图将你的 withTemplateObjectDraggable
HOC 传入。因此 Typescript 抱怨类型不兼容。
我不是 100% 确定它是否有效,但请尝试将 DragSource
移动到您的 HOC 中,如下所示:
function withTemplateObjectDraggable(WrappedComponent: React.ComponentClass<TemplateObjectProps>) {
class WithTemplateObjectDraggable extends React.Component<TemplateObjectCollectedProps> {
public render() {
return this.props.connectDragSource(
<div>
<WrappedComponent {...this.props} />
</div>,
);
}
}
return DragSource(ItemTypes.TEXTFIELD, templateObjectSource, collect)(WithTemplateObjectDraggable);
}