对于RemoteEntity
的每个实例化,我在This type is incompatible with empty
的类型参数上出错,引用null
中value
的{{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?
答案 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
}