2016-04-26 2 views
29

Flow дает мне следующую ошибку, когда я пытаюсь использовать this.state в моем коде:Flow (React Native) дает мне ошибки для использования «» this.state

литерал объекта: Этот тип несовместим с undefined. Вы забыли объявить параметр типа State идентификатора Component:

Вот код обижая (хотя это происходит в других местах тоже):

class ExpandingCell extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     isExpanded: false 
    }; 
} 

Любая помощь будет высоко ценится =)

+0

Можете ли вы опубликовать другие функции? – QoP

ответ

52

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

class ComponentA extends Component { 
    state: { 
     isExpanded: Boolean; 
    }; 
    constructor(props) { 
     super(props); 
     this.state = { 
      isExpanded: false 
     }; 
    } 
} 
+0

Это действительно ответ, спасибо! Я до сих пор неясно, почему приложение работает несмотря на эту ошибку ... –

+0

Причина, по которой приложение работает, несмотря на ошибку, связано с тем, что приложение не нуждается в этом. Поток нуждается в том, чтобы он мог корректно выполнять проверку типов, но не фактическое приложение. – edvinerikson

+1

Это было бы здорово, если бы я мог получить поток, чтобы игнорировать эту ошибку, тогда =) –

-19

удалить /* @flow */ в вас код FLITE верхней

+10

Я получил хороший смешок из этого ответа. – bmavity

+0

ну ... это правильно не так ... – Andy

+0

Должен быть предоставлен больше контекста, включая возможные варианты ... т.исправьте установку потока или отключите, если это не нужно. – Joe

5

Если вы используете поток и хотите установить this.state в вашей компонентной constructor:


1. Создать type за this.state

type State = { width: number, height: number } 

2. Инициализировать свой компонент с этим type

export default class MyComponent extends Component<Props, State> { ... } 

3. Теперь вы можете установить this.state без потока ошибки

constructor(props: any) { 
    super(props) 
    this.state = { width: 0, height: 0 } 
    } 

Вот более ком пример, который обновляет this.state с шириной и высотой компонента, когда вызывается onLayout.

// @flow 

import React, {Component} from 'react' 
import {View} from 'react-native' 

type Props = { 
    someNumber: number, 
    someBool: boolean, 
    someFxn:() => any, 
} 

type State = { 
    width: number, 
    height: number, 
} 

export default class MyComponent extends Component<Props, State> { 

    constructor(props: any) { 
    super(props) 

    this.state = { 
     width: 0, 
     height: 0, 
    } 
    } 

    render() { 

    const onLayout = (event) => { 
     const {x, y, width, height} = event.nativeEvent.layout 
     this.setState({ 
     ...this.state, 
     width: width, 
     width: height, 
     }) 
    } 

    return (
     <View style={styles.container} onLayout={onLayout}> 

     ... 

     </View> 
    ) 
    } 
} 

const styles = StyleSheet.create({ 
    container: { 
    display: 'flex', 
    flexDirection: 'column', 
    justifyContent: 'center', 
    alignItems: 'center', 
    }, 
}) 
+0

Как использовать определение типа 'Props'? – Felix

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