【问题标题】:Flow Javascript "Missing type annotation for T" And "Missing type annotation for S"Flow Javascript“缺少T的类型注释”和“缺少S的类型注释”
【发布时间】:2019-05-06 17:37:55
【问题描述】:

我正在上 React Native 的课程,然后使用 Flow 尝试纠正课程中的错误,因为讲师没有使用任何类型检查。

我在使用 Flow 时遇到了另一个错误,通过在互联网上的长时间搜索无法找到答案。我在同一行上遇到这两个错误。我不知道这些错误是什么意思。这让我很困惑,搜索 Flow 文档并没有为我服务,因为它根本没有解释这一点。

我正在使用带有核素和流量 0.78 的 Atom。

缺少 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;

这些错误令人沮丧,而且毫无意义。我相信我不是唯一一个为此苦苦挣扎的人。可能还有其他人。

如果有人知道这个问题的答案。帮助将不胜感激。

另外,如果有人可以指出一些文档,将这些流错误转换为更有意义或更容易理解的东西,那将是一个很大的帮助,因为官方文档没有解释太多也没有太多示例学习。

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    从 Flow v0.70 开始,使用 filter、map、concat 等数组方法导出的函数应指定返回类型。 在您的情况下,这应该可以解决它:

    const reducer = (state : State = initialState, action : Action): State
    

    详见this讨论。

    【讨论】:

      【解决方案2】:

      flow 似乎在推断 places 的类型时遇到了问题,因此您可能需要帮助它。

      这是 Array.concat 的类型定义

      concat<S, Item: $ReadOnlyArray<S> | S>(...items: Array<Item>): Array<T | S>
      

      所以你会想要这样的东西

      state.places.concat<Object>([ ... ])
      

      这里需要注意的是,您将一个对象传递给 concat,但它应该采用一个数组。你可能对filterstate.places.filter&lt;Object&gt;(...)也可以这样做

      【讨论】:

        猜你喜欢
        • 2019-09-07
        • 2019-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-17
        • 2010-09-17
        相关资源
        最近更新 更多