У меня проблема с определением того, что я должен передать свойству, которое в основном является функцией, которая отправляет запрос в мой 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;
}