class Pedal {} type PetrolVehicle = 'car' | 'bus'; type PedalVehicle = 'bike'; opaque type Vehicle<P> = PetrolVehicle | PedalVehicle; export const createPetrolVehicle = (t: PetrolVehicle): Vehicle<Petrol> => { return t; }; export const createPedalVehicle = (t: PedalVehicle): Vehicle<Pedal> => { return t; }; export const wheels = <P>(vehicle: Vehicle<P>) => { return vehicle === 'bike' ? 2 : 4; }; export const fuel = (vehicle: Vehicle<Petrol>) => { // only a vehicle powered by petrol can be fueled }; // @flow // index.js import { createPetrolVehicle, createPedalVehicle, wheels, fuel, } from './vehicle'; const car = createPetrolVehicle('car'); wheels(car); fuel(car); const bike = createPedalVehicle('bike'); wheels(bike); fuel(bike); // compile-time error