Реагировать - свойство отсутствует в типе {} - PullRequest
0 голосов
/ 08 июня 2018

У меня проблема с определением того, что я должен передать свойству, которое в основном является функцией, которая отправляет запрос в мой API для получения данных.Когда я хочу отобразить Header в моем Layout компоненте, он выдает ошибку requestAvailableContexts is missing in type {}

Возможно ли как-то сделать свойство requestAvailableContexts, которое представляет функцию, необязательным?

Iможет обойти ошибку, используя это <Header requestAvailableContexts={null} /> значение свойства null, но я не думаю, что это хороший подход

Это мой компонент макета

export class Layout extends React.Component<{}, {}> {
public render() {
    return <div className="app_layout">
        // here it throws me an error that requestAvailableContexts property is missing
        <Header /> 
        //I can bypass that by setting property to null
        //<Header requestAvailableContexts={null} /> 
        <div className="app_menu col-sm-4 col-md-4 col-lg-2 no-side-padding">
            <NavMenu />
        </div>
        <div className='col-lg-10'>
            {this.props.children}
        </div>
    </div>;
}}

Компонент заголовка, который содержит компонент раскрывающегося списка, гдеМне нужно загрузить некоторые данные из моего API-интерфейса и подключенного к нему хранилища через redux connect ()

type ProcessListProps =
    HeaderState.IImporterSelectorContextState
    & typeof HeaderState.actionCreators;

class Header extends React.PureComponent<ProcessListProps, {}> {
    constructor(props) {
        super(props);
    }

    componentWillMount(): void {
        this.props.requestAvailableContexts(this.props.dataQuery);
    }

    render() {
        return (
            <header>
                <div className="app_header">
                    <div className="containerLogo">
                        <Logo />
                    </div>      
                    <nav className="">                      
                        <DropDownList
                            data={this.props.data}
                            textField={'code'}
                            value={'id'}
                            className="dd-header" />
                        <Notification />
                        <Logout />
                        <Fullscreen />
                    </nav>
                </div>
            </header>
        );
    }
}

export default connect(
    (state: ApplicationState) => state.headerContextSelector,
    HeaderState.actionCreators
)(Header) as typeof Header;

Это мой компонент, в котором я определяю создатель редуктора и действия для Header компонента

const GET_AVAILABLE_CONTEXTS = "GET_AVAILABLE_CONTEXTS";
const GET_AVAILABLE_CONTEXTS_SUCCESS = "GET_AVAILABLE_CONTEXTS_SUCCESS";

export interface IImporterSelectorContextState {
    dataQuery?: ServiceApi.IDataQuery;
    data?: any[];
}

//request to api for all available contexts to user
interface AllAvailableContexts {
    type: typeof GET_AVAILABLE_CONTEXTS;
    data: { query: any }
}

export const getAvailableContexts = (dataQuery: ServiceApi.IDataQuery): AllAvailableContexts => ({
    type: GET_AVAILABLE_CONTEXTS,
    data: { query: dataQuery }
});

//successfull respond from api to get all available contexts
interface GetAllImporterContextDataSuccess {
    type: typeof GET_AVAILABLE_CONTEXTS_SUCCESS;
    data: any;
}

export const getAllImporterContextDataSuccess = (data: any): GetAllImporterContextDataSuccess => ({
    type: GET_AVAILABLE_CONTEXTS_SUCCESS,
    data: data
});

type KnownAction = 
    AllAvailableContexts |
    GetAllImporterContextDataSuccess | 
    GetAllImporterContextDataFailure

export const actionCreators = {
    requestAvailableContexts: (dataQuery: ServiceApi.IDataQuery): AppThunkAction<KnownAction> => (dispatch, getState) => {
        client.apiImporterDataPost(ServiceApi.DataQuery.fromJS(dataQuery))
            .then(result => dispatch(getAllImporterContextDataSuccess(result.data)))

        dispatch(getAvailableContexts(dataQuery));
    }
}

const unloadedState: IImporterSelectorContextState = {
    dataQuery: {
        collectionName: "",
        filter: {},
        sort: {},
        projection: {},
        take: 200,
        skip: 0,
        includeTotalCount: false,
        context: null,
        dialect: 0,
        parameters: null,
    },
    data: []
};

export const reducer: Reducer<IImporterSelectorContextState> = (state: IImporterSelectorContextState,
    incomingAction: Action) => {

    const action = incomingAction as KnownAction;
    switch (action.type) {
        case GET_AVAILABLE_CONTEXTS:
            return {
                ...state
            }
        case GET_AVAILABLE_CONTEXTS_SUCCESS:
            return {
                ...state,
                data: action.data
            }
        default:
            const exhaustiveCheck: never = action;
    }
    return state || unloadedState;
}

1 Ответ

0 голосов
/ 08 июня 2018

Вы используете типы потоков

type ProcessListProps =
    HeaderState.IImporterSelectorContextState
    & typeof HeaderState.actionCreators 
    & typeof (string) => void;

Решение состоит в том, чтобы выполнить проверку в компоненте Header перед вызовом этой функции

componentWillMount(): void {
    if(this.props.requestAvailableContexts) {
      this.props.requestAvailableContexts(this.props.dataQuery);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...