我正在React Native上上一堂课,然后使用Flow尝试纠正该类的错误,因为讲师没有使用任何类型检查。
我遇到了Flow的另一个错误,该错误通过长时间的互联网搜索无法找到答案。我在同一行上遇到了这两个错误。我不知道这些错误意味着什么。这使我感到困惑,并且搜索Flow文档对我没有用,因为它根本没有解释这一点。
我正在将Atom与Nuclide和Flow一起使用0.78。
缺少T的类型注释。
和
缺少S的类型注释。
这是带有我标记出的错误的代码。
/* @flow */
import { ADD_PLACE, DELETE_PLACE, SELECT_PLACE, DESELECT_PLACE } from '../actions/actionTypes.js'
type State = {
places: Array<Object>,
selectedPlace: ?{
key: string,
name: string,
image: Image
}};
type Action = { type : string, placeName: string, placeKey: string};
const initialState = {
places: [],
selectedPlace: null
}
const reducer = (state : State = initialState, action : Action) => {
switch (action.type) {
case ADD_PLACE:
return {
...state,
places: state.places.concat({ <-- Error
key: String(Math.random()),
name: action.placeName,
image: {
uri: "https://cdn.newsapi.com.au/image/v1/f08d8ccc83fbc2d08529aea69890ad4d?width=1024"
}
})
};
case DELETE_PLACE:
return {
...state,
places: state.places.filter(place => {. <--Error
return state.selectedPlace && place.key !== state.selectedPlace.key;
}),
selectedPlace: null
};
case SELECT_PLACE:
return {
...state,
selectedPlace: state.places.find(place => {
return place.key == action.placeKey;
})
};
case DELETE_PLACE:
return {
...state,
selectedPlace: null
};
default:
return state;
}
};
export default reducer;
这些错误令人沮丧,而且没有道理。我确信我不是唯一为此苦苦挣扎的人。可能还有其他。
如果有人知道此问题的答案。帮助将不胜感激。
此外,如果任何人都可以指向一些文档,这些文档将把此类Flow错误转化为更有意义或更容易理解的内容,那将是非常有帮助的,因为官方文档没有解释太多或太多示例学习。
如果有一些更明确的文档可以学习,那也将大有帮助。
谢谢。
答案 0 :(得分:1)
从Flow v0.70导出的函数开始,使用诸如filter,map,concat之类的数组方法,应指定返回类型。 在您的情况下,应该可以解决此问题:
const reducer = (state : State = initialState, action : Action): State
有关详细信息,请参见this讨论。
答案 1 :(得分:0)
似乎流程在推断places
类型方面遇到问题,因此您可能需要一点帮助。
这是Array.concat的类型定义
concat<S, Item: $ReadOnlyArray<S> | S>(...items: Array<Item>): Array<T | S>
所以你想要这样的东西
state.places.concat<Object>([ ... ])
这里要注意的一点是,您要将对象传递给concat,但它应该使用数组。您可能会对filter
,state.places.filter<Object>(...)