2017-06-22 23 views
0

我怎麼能流檢查該文件正確, 該組件上的狀態的條件呈現基地, 流說Property cannot be accessed on possibly null value狀態對象的流條件值?

什麼,如果我有一個更復雜的狀態結構如{} user.owner.name。 .. 如何正確設置類型?

type User = { 
    title: string, 
    description: string, 
    year: string, 
    imdbID: string, 
    poster: string, 
    trailer: string 
}; 

class AllUser extends React.Component { 
    state: { 
    repos: Array<?User>, 
    repos2: Array<?User> 
    }; 

    handleChange:() => void; 
    filterItem:() => void; 

    constructor() { 
    super(); 
    this.state = { 
     repos: [], 
     repos2: [] 
    }; 
    this.handleChange = this.handleChange.bind(this); 
    this.filterItem = this.filterItem.bind(this); 

    } 

    componentDidMount() { 
    if (this.state.repos.length === 0) { 
     fetchPopularRepos("all").then((repos: Array<?User>) => { 
     this.setState({ 
      repos: repos, 
      repos2: repos 
     }); 
     }); 
    } 
    } 

    render() { 
    if (this.state.repos.length === 0) { 
     return (
     <div>loading</div> 
    ); 
    } 
    return (
     <div> 
     {this.state.repos.map(repo => <p>{repo.name}</p>)} 
     </div> 
    ) 
    } 
} 
+0

爲什麼使用'Array '而不是'Array '? '?'表示數組可能有空/未定義的值,但是他們在每個條目上都執行'repo.name'。根據您提供的類型,這是一個有效的錯誤。 – loganfsmyth

+0

你的意思是'回購:?數組',並通過這個流程將聰明地選擇'repo.name'或不? – Liuuil

+0

根本不需要問號。數組允許爲空。你現在擁有的是「一個null或者一個用戶的數組」,所以你說數組中的項可以是null,但是代碼本身並沒有暗示你最終會用null來代替一個'用戶'對象。 – loganfsmyth

回答

0

repos: Array<?User>意味着repos屬性爲「項目,每個項目可以是nullundefinedUser的陣列。

repos: ?Array<User>意味着repos屬性爲」 nullundefined,或陣列的項目,其中每個項目必須是User

repos: Array<User>意味着repos屬性爲「物品,其中,每個項目必須是陣列的User

由於正在使用的第一個,與

this.state.repos.map(repo => <p>{repo.name}</p>) 

你流識別repos將是一個數組,但是你的類型聲明Array<?User>repo裏面的回調可能是User,nullundefined,所以既然.name o n a nullundefined值會引發異常,Flow會拋出錯誤。這是給定類型的正確行爲。

這兩個地方分配repos

this.state = { 
    repos: [], 
    repos2: [] 
}; 

fetchPopularRepos("all").then((repos: Array<?User>) => { 
    this.setState({ 
    repos: repos, 
    }); 
}); 

所以對於你的問題是,fetchPopularRepos返回包含nullundefined值的數組?這對我來說似乎很奇怪。如果一個項目不是用戶,它根本不應該包含在數組中。包括null值只會造成混淆。

這裏給出的解決將是改變

.then((repos: Array<?User>) => { 

.then((repos: Array<User>) => { 

所以你保證陣列只包含User對象,然後更改

state: { 
    repos: Array<?User>, 
    repos2: Array<?User> 
    }; 

state: { 
    repos: Array<User>, 
    repos2: Array<User> 
    };