abstraction in TypeScript