1.  
  2. enum EventType { Mouse, Keyboard }
  3.  
  4. interface Event { timestamp: number; }
  5. interface MouseEvent extends Event { x: number; y: number }
  6. interface KeyEvent extends Event { keyCode: number }
  7.  
  8. function listenEvent(eventType: EventType, handler: (n: Event) => void) {
  9. /* ... */
  10. }
  11.  
  12. // Unsound, but useful and common
  13. listenEvent(EventType.Mouse, (e: MouseEvent) => console.log(e.x + "," + e.y));
  14.  
  15. // Undesirable alternatives in presence of soundness
  16. listenEvent(EventType.Mouse, (e: Event) => console.log((e).x + "," + (e).y));
  17. listenEvent(EventType.Mouse, <(e: Event) => void>((e: MouseEvent) => console.log(e.x + "," + e.y)));
  18. // Still disallowed (clear error). Type safety enforced for wholly incompatible types
  19. listenEvent(EventType.Mouse, (e: number) => console.log(e));