Maybe-type泛型类型参数与empty不兼容

时间:2017-04-07 13:38:00

标签: flowtype

对于RemoteEntity的每个实例化,我在This type is incompatible with empty的类型参数上出错,引用nullvalue的{​​{1}}值:< / p>

newRemoteEntity

如果我改为声明export type RemoteEntity<T: Identifiable> = { value: ?T; error: ?Error; // ... } export function newRemoteEntity(): RemoteEntity<*> { return { value: null, // error error: null, // OK // ... } } ,那么这些错误就会消失(但我会得到与失去类型限制相关的其他错误)。我错过了什么或者是这个Flowtype bug / quirk?

1 个答案:

答案 0 :(得分:1)

我找到了一个解决方法,使字段可选(而不是必需但使用may-type)。但是,它使得其他代码更复杂一些(因为我必须检查空值而不是仅仅在对象文字中传播它们),所以我更喜欢让类型工作。

export type RemoteEntity<T: Identifiable> = {
  value?: T;
  error?: Error;
  pendingAction: ?string;
  // ...
}

export function newRemoteEntity(): RemoteEntity<*> {
  return {
    pendingAction: null,
    // ...
  }
}

export function requested<T: Identifiable>(
    state: RemoteEntity<T>, action: string, id?: string): RemoteEntity<T> {
  // Maybe-type version was more concise:
  // return {
  //   state: id && state.value && state.value.id === id ? state.value : null,
  //   error: null,
  //   pendingAction: action,
  //   // ...
  // }
  const result: RemoteEntity<T> = {
    pendingAction: action,
    // ...
  }
  if (id && state.value && state.value.id === id) {
    result.value = state.value
  }
  return result
}