编辑:Here is a full GitHub repo显示问题的最小示例。
我有一个简单的Counter应用程序。以下是我的行动创作者:
actions.js
/**
* @flow
*/
import { INCREMENT, DECREMENT } from '../constants'
type Action =
| { type: 'INCREMENT' }
| { type: 'DECREMENT' }
function increment(): Action {
return {
type: INCREMENT
}
}
function decrement(): Action {
return {
type: DECREMENT
}
}
export { increment, decrement }
export type { Action }
目前,我在increment
和decrement
函数中都收到错误,指出对象文字无法决定选择联合类型的情况。
要解决这些错误,我可以将type: INCREMENT
更改为type: 'INCREMENT'
并将type: DECREMENT
更改为type: 'DECREMENT'
。但是,我将在多个地方使用这个常量(比如reducer),所以我希望能够导入常量并在那里使用它。这不是它在flowtype中完成的方式吗?
为清楚起见,以下是其余文件:
constants.js
/**
* @flow
*/
const INCREMENT: 'INCREMENT' = 'INCREMENT'
const DECREMENT: 'DECREMENT' = 'DECREMENT'
export {
INCREMENT,
DECREMENT
}
reducer.js
/**
* @flow
*/
import { INCREMENT, DECREMENT } from '../constants'
import type { Action } from '../actions'
type State = number
function counter(state: State = 0, action: Action): State {
switch (action.type) {
case INCREMENT:
return state + 1
case DECREMENT:
return state - 1
default:
return state
}
}
export default counter
编辑:这是一个详细的错误日志
src/actions/counter.js:12
v
12: return {
13: type: INCREMENT
14: }
^ object literal. Could not decide which case to select
11: function increment(): Action {
^^^^^^ union type
Case 1 may work:
8: | { type: 'INCREMENT' }
^^^^^^^^^^^^^^^^^^^^^ object type
But if it doesn't, case 2 looks promising too:
9: | { type: 'DECREMENT' }
^^^^^^^^^^^^^^^^^^^^^ object type
Please provide additional annotation(s) to determine whether case 1 works (or consider merging it with case 2):
13: type: INCREMENT
^^^^^^^^^ identifier `INCREMENT`
src/actions/counter.js:18
v
18: return {
19: type: DECREMENT
20: }
^ object literal. Could not decide which case to select
17: function decrement(): Action {
^^^^^^ union type
Case 1 may work:
8: | { type: 'INCREMENT' }
^^^^^^^^^^^^^^^^^^^^^ object type
But if it doesn't, case 2 looks promising too:
9: | { type: 'DECREMENT' }
^^^^^^^^^^^^^^^^^^^^^ object type
Please provide additional annotation(s) to determine whether case 1 works (or consider merging it with case 2):
19: type: DECREMENT
^^^^^^^^^ identifier `DECREMENT`
答案 0 :(得分:4)
尝试将typeof
添加到您的操作声明中:
type Action =
| { type: typeof INCREMENT }
| { type: typeof DECREMENT }
您也可以使用$Keys
const ActionTypes = {
INCREMENT: 'INCREMENT',
DECREMENT: 'DECREMENT'
}
type Action = { type: $Keys<typeof ActionTypes> }