2016-12-29 4 views
2

У меня есть компонент React, который использует функцию refractx connect (декоратор) для установки свойств. При упоминании этого компонента в JSX, flowtype жалуется «свойство не найдено в ... реквизита Реагировать элемент»React Redty Flowtype «свойство не найдено» в элементе React, которое получает свойства от соединения redux.

type SidebarCmpProps = { 
    activeSidebarComponent: string, 
    actions: { openCallMember:() => void } 
} 

@connect(
    (state) => { 
    return { activeSidebarComponent: state.sidebar.activeSidebarComponent } 
    }, 
    (dispatch) => ({ actions: bindActionCreators({ openCallMember }, dispatch) }) 
) 
class Sidebar extends React.Component { 
    props: SidebarCmpProps 
    static propTypes = { 
    actions: React.PropTypes.object.isRequired, 
    activeSidebarComponent: React.PropTypes.string 
    } 
} 

Точная ошибка:

 
65:   
      ^^^^^^^^^^^ React element `Sidebar` 
56: props: SidebarCmpProps 
       ^^^^^^^^^^^^^^^ property `actions`. Property not found in... 
65:   
      ^^^^^^^^^^^ props of React element `Sidebar` 

Чтобы обойти эту ошибку, я имел для изменения свойств типов союза any и добавить defaultProps, что меньше, чем идеальный

type SidebarCmpProps = { 
    activeSidebarComponent: any | string, 
    actions: any | { openCallMember:() => void } 
} 
class Sidebar extends React.Component { 
    static defaultProps: SidebarCmpProps = { 
    actions: null, 
    activeSidebarComponent: null 
    } 
} 

Есть ли лучшее решение?

+0

Вы пытались дать 'action' форму в' propTypes'? –

+0

Изменение 'actions' в форме в' propTypes' не мешает мне использовать тип 'any' union для« решения »ошибки. Я также получаю ту же ошибку из 'activeSidebarComponent: string' prop (не вставлен выше для краткости). – joshm1

ответ

-1

Если вы хотите, чтобы оба компонента реквизита по желанию, вы должны определить их так:

type SidebarCmpProps = { 
    activeSidebarComponent?: string, 
    actions?: { openCallMember:() => void } 
} 

Кроме того, я не уверен, что это хорошая идея, чтобы обеспечить как РЕАКТ propTypes и flowtype , Это дублирование логики, не так ли?

+1

Проблема в том, что я не хочу, чтобы она была необязательной. Ваше предложение потребует от меня проверки нулевого значения, что будет лишним, потому что я знаю, что эти свойства всегда будут заданы функцией connect-redux 'connect'. Я действительно ищу способ сообщить потоку игнорировать/пропустить эту проверку для определенных компонентов. – joshm1

0

Ну, вы получаете ошибку property 'actions'. Property not found in, потому что вы только что установили activeSidebarComponent опору в @connect, и действия объявлены как необходимые опоры actions: React.PropTypes.object.isRequired.

Итак, вы должны установить значение по умолчанию для actions или удалить это ограничение.

+2

Да, я знаю, что для некоторых из них я мог бы создать значения по умолчанию для фиктивных/no-op. Но это просто создает кучу нового и бесполезного шаблона, поскольку значения по умолчанию никогда не будут использоваться, пока они отображаются в функции 'connect'. Я надеялся, что есть способ настроить поток, чтобы игнорировать эту проверку. – joshm1

Смежные вопросы