React-redux соединяется с универсальным типом - PullRequest
0 голосов
/ 11 ноября 2019

Я использую машинопись и реагирую.

У меня есть родительский компонент с некоторой функцией и функцией визуализации по умолчанию. У меня есть 20 дочерних компонентов с переопределенной функцией и без рендеринга.

Я хотел бы, чтобы это работало =>

PARENT:

class Field<T> extends React.Component<T> {
    state = { fieldMode : FieldMode.DISPLAY}

    fieldEditMode() {
        return (
            <div>
            </div>
        )
    }

    fieldDisplayMode() {
        return (
            <div>
            </div>
        )
    }

    render() {
        return (
            this.state.fieldMode === FieldMode.DISPLAY ? this.fieldDisplayMode() : this.fieldEditMode()
        )
    }
}

export default Field;

Дочерний элемент:

export interface UserFieldProps extends FieldProps {
    fieldId: string;
    field: ItemDetailsField;
    value: any;
}

class UserField extends Field<UserFieldProps> {
    fieldEditMode() {
        return (
            <div>
                EDITING : 
                UserField : {this.props.value}
            </div>
        )
    }

    fieldDisplayMode() {
        return (
            <div>
                DISPLAYING : 
                UserField : {this.props.value}
            </div>
        )
    }

    render() {
        return super.render(); 
    }
}

Это прекрасно работает без использования реквизита, если я просто export default Field смогу достичь того, чего хочу.

Но я бы хотел добавить опоры на стенд моего поля и моего ребенка

    const mapStateToProps = (state: RootState) => ({
    })

    const mapDispatchToProps = {
    }

    export default connect(
        mapStateToProps,
        mapDispatchToProps
    )(Field as new(props: Field<T>) => Field<T>);

Проблема

Поскольку реквизиты ребенка могут измениться, мне нужно объявить детей следующим образом: class UserField extends Field<UserFieldProps> {

Но, если я это сделаю, янужно иметь общий Field<T>

Поэтому я попробовал следующее

export default connect(
    mapStateToProps,
    mapDispatchToProps
)(Field as new(props: Field<T>) => Field<T>);

Не могу найти имя 'T'

или

export default function FieldContainer<T>() {
    return connect(
        mapStateToProps, mapDispatchToProps
    )(Field as new(props: ComponentProps<T>) => Field<T>);
}

Аргумент типа 'new (props: any) => Field' нельзя назначить параметру типа 'ComponentType>'

export default connect(
    mapStateToProps,
    mapDispatchToProps
)(Field);

Другой дочерний компонент будетне работает с

Базовый конструктор не имеет указанного числа аргументов типа. ts

Есть ли способ достичь этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...