sealed case classes in flow
flowtype, javascript, scala
Solution
The `empty` type can be used to verify that Flow is convinced of exhaustiveness
export const todo = (todo: TodoTy, action: TodoActionTy) => {
switch (action.type){
case 'ADD_TODO' :
...
case 'TOGGGGLE_TODO':
...
default :
// only true if we handled all cases
(action: empty)
// (optional) handle return type
throw 'unknown action'
}
}
Problem
I'm trying to emulate Scala's sealed case classes in Flow by using disjoint unions: ``` type ADD_TODO = { type:'ADD_TODO', text:string, id:number } type TOGGLE_TODO = {type:'TOGGLE_TODO', id:number } type TodoActionTy = ADD_TODO | TOGGLE_TODO const todo = (todo:TodoTy, action:TodoActionTy) => { switch (action.type){ case 'ADD_TODO' : return { id:action.id, text:action.text, completed: false}; case 'TOGGGGLE_TODO': // this should give a type error if (todo.id !== action.id) {return todo;} return {...todo, completed:!todo.completed}; } } ``` I should get a type error for `case 'TOGGGGLE_TODO':` but I don't. Is there a way to fix that ? EDIT: I paste here the code from Gabriele's comment for future-proof-ness: ``` type TodoTy = {}; type ADD_TODO = { type: 'ADD_TODO', text: string, id: number }; type TOGGLE_TODO = { type: 'TOGGLE_TODO', id: number }; type TodoActionTy = ADD_TODO | TOGGLE_TODO; export const todo = (todo: TodoTy, action: TodoActionTy) => { switch (action.type){ case 'ADD_TODO': break; // Uncomment this line to make the match exaustive and make flow typecheck //case 'TOGGLE_TODO': break; default: (action: empty) } } ```