流程Javascript“ T的缺少类型注释”和“ S的缺少类型注释”

时间:2018-12-05 07:43:08

标签: javascript react-native redux react-redux flowtype

我正在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错误转化为更有意义或更容易理解的内容,那将是非常有帮助的,因为官方文档没有解释太多或太多示例学习。

如果有一些更明确的文档可以学习,那也将大有帮助。

谢谢。

2 个答案:

答案 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,但它应该使用数组。您可能会对filterstate.places.filter<Object>(...)

做同样的事情